Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];

Вниз

Синтезатор на Delphi   Найти похожие ветки 

 
suslik-lamer   (2005-11-13 23:32) [0]

Как можно проиграть звук определенной высоты и инструмента (типа синтезатор) через колонки. Нигде не могу найти, как это реализовать


 
XProger ©   (2005-11-14 02:48) [1]

А в MSDN не пробовал искать?
mci* функции ;)


 
suslik-lamer   (2005-11-23 19:16) [2]

А можно поподробней?


 
programania ©   (2005-11-23 22:09) [3]

Вот недоделаный синтезатор
1 инструмент, delphi5, 1 октава на клавиши 0..9,-,=
и множество настроек
http://programania.com/syn.zip  7кб


 
suslik-lamer   (2005-11-24 14:21) [4]

Спасибо, посмотрю, попробую разобраться, если чего не пойму еще раз спрошу. Еще раз спасибо


 
suslik-lamer   (2005-11-26 21:58) [5]

Немного не то. Вот есть некий "программный синтезатор звуковой" и устройство MPU-401/ Хочется научиться их использовать. Помогите пожалуйста


 
Anton_K ©   (2005-11-26 22:12) [6]

DirectMusic должен помочь.


 
TMidiGen   (2005-11-28 16:18) [7]

http://www.torry.net/quicksearchd.php?String=midigen&Title=Yes

TMidiGen


 
suslik-lamer   (2005-12-06 22:17) [8]

Огромное спасибо за последнюю ссылочку!
Вот только есть маленький вопрос. Если я хочу сделать синтезатор ударных, то не получается сделать быструю трелль, не успевает звук проиграться. Пытался в разные каналы подавать, но что-то не получается


 
programania ©   (2005-12-07 19:58) [9]

еще в TMidiGen не понятно как одновременно играть несколько
инструментов с разной громкостью и все слишком сложно
на самом деле все гораздо проще
вот быстрая трелль из ударных:

program drum;
uses Forms,mmSystem,dialogs,windows;

var
hMidi    :integer;
midimsg  :integer;
uTimerID :uint=0;
ni       :integer=0;

procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;
begin
midimsg := $99 + ((35+ni) * $100) + (127 * $10000) + 0;
midiOutShortMsg (hmidi, midimsg);
inc(ni);
if ni>8 then ni:=0;
end;

begin
Application.Initialize;
midiOutOpen(@hmidi, 0, 0, 0, 0);
//100 мСек период повторения
uTimerID:=timeSetEvent (100,0,@FNTimeCallBack,0,TIME_PERIODIC);
showMessage("надоела?");
midiOutClose(hmidi);
if uTimerID<>0 then timeKillEvent(uTimerID);
end.


 
suslik-lamer   (2005-12-07 22:32) [10]

На самом деле все гораздо проще
А можно если не трудно, обьяснить что каждая строка делает, а то я в Delphi не такой мастер и не все пока понимаю.
Кстати, в TMidigen можно также организовать трелль, но только с помощью PlayString, ну хоть вот-так
MidiGen1.PlayString("I128, C, 5; E, 5; D,5;F,5");
Но такой вариант не проходит, т.к надо ждать нажатия клавиши и уж потом использовать PlayNote или Play

И еще одна просьба. Подкиньте пожалуйста ссылки на статьи о программированию Sound карты.


 
Digitman ©   (2005-12-08 16:57) [11]

для сусликов индивидуально -

http://delphimaster.net/view/8-1133854405/


 
programania ©   (2005-12-08 21:27) [12]

>А можно если не трудно, обьяснить что каждая строка делает,

Поставьте в delphi курсор на непонятное слово, нажмите F1
Хотя если не понятны строки begin end то уже ничего не поможет.

>Если я хочу сделать синтезатор ударных,

А чего ж только ударных? давайте уж делать и все остальное
Вот пример для пианины:

program piano;
uses Forms,mmSystem,dialogs,windows;
var
hMidi,i  :integer;
midimsg  :integer;
uTimerID :uint=0;
mt  :array[1..32] of integer; //массив нот такта
qt: integer=8;  //число нот в такте
nd: integer;    //номер играемого такта
qo: integer=0;  //число прошедших отсчетов
dt: integer=15; //темп в 0.01 сек
pt: integer=0;  //проиграно тактов
ni: integer=0;  //номер инструмента
pn: integer=0;  //играемая нота
na: integer=0;  //играемая нота акорда
ti: integer=0;  //время инструмента

PROCEDURE notaT(i:integer);
begin
//получение ноты для доли такта i в mt
if (random(10)<9) or(i=1) then mt[i]:=40+random(12)+1 else mt[i]:=0;
end;

procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;
var a,d,nt,nn:integer;
begin
inc(qo);
if qo>dt then begin
//Новая доля такта nd
inc(nd);
if nd>qt then begin
 nd:=1;
 inc(ti);
 if ti>24-ni then begin
   if ni=0 then ni:=19 else ni:=0;
   ti:=0;
 end;
//внесение разнообразия в новый такт
//смена тактового размера
 if random(10)=9 then if qt<10 then inc(qt,2);
 if random(10)=9 then if qt>4  then dec(qt,2);
 d:=random(qt)+1;      //смена 1 ноты d такта
 notaT(d);
 inc(pt);
 if na<>0 then begin
   midimsg := $80 + (na * $100);
   midiOutShortMsg (hmidi, midimsg);
   na:=0;
 end;

 if ni<128 then begin
//аккорд в начале такта
   na:=mt[1];
   if random(5)>3 then inc(na,3+random(2))else dec(na,3+random(3));
   midimsg := $C0 + (ni * $100);
   midiOutShortMsg (hmidi, midimsg);
   midimsg := $90 + (na * $100) + (80 * $10000) + 0;
   midiOutShortMsg (hmidi, midimsg);
  end;
end;
qo:=0;
nn:=mt[nd];
if nn<>0 then begin
 if pn<>0 then begin
   midimsg := $80 + (pn * $100);
   midiOutShortMsg (hmidi, midimsg);
   pn:=0;
 end;
 pn:=nn;
//установка инструмента
 midimsg := $C0 + (ni * $100);
 midiOutShortMsg (hmidi, midimsg);
//запуск игры ноты pn
 midimsg := $90 + (pn * $100) + ((100-ni-(nd-1)*4) * $10000) + 0;
 midiOutShortMsg (hmidi, midimsg);
end;
end;
end;

begin
Application.Initialize;
randomize;
midiOutOpen(@hmidi, 0, 0, 0, 0);
for i:=1 to qt do notaT(i);
uTimerID:=timeSetEvent (10,0,@FNTimeCallBack,0,TIME_PERIODIC);
showMessage("надоела?");
midiOutClose(hmidi);
if uTimerID<>0 then timeKillEvent(uTimerID);
end.

А сколько времени эта программа выдержит тест Тьюринга?


 
Digitman ©   (2005-12-09 08:48) [13]


> programania


То что ты пытаешься втолковать автору, синтезатором как таковым не является.

Это у тебя - простейший MIDI-секвенсер.

Надеюсь, разница между синтезом собственно звука и синтезом управляющей MIDI-последовательности  должна быть очевидна.


 
guitarist   (2005-12-17 20:25) [14]

Все-таки никто не может написать код синтезатора, а то бы и мне пригодилось, а претензию Digitman даже я понял -- последовательно играть несколько midi нот вроде уже понял как (наверное, это умно выражаясь и есть простейший MIDI-секвенсер), а вот, чтобы нажав на кнопку игралась одна нота, а при нажатии сразу же на другую -- другая. Предложенный вариант не проходит.


 
programania ©   (2005-12-18 01:36) [15]

>Digitman ©   (09.12.05 08:48) [13]
>Это у тебя - простейший MIDI-секвенсер.

см.
http://www.midi.ru/doc/53.htm
Секвенсор:
Электронное устройство, воспроизводящее заранее записанные музыкальные "команды".

А как назвать программу которая посылает на воспроизведение команды,
нигде не записанные заранее , т.е. делает синтез управляющей MIDI-последовательности  

>Надеюсь, разница между синтезом собственно звука и синтезом управляющей MIDI-последовательности
>должна быть очевидна.

Синтез звука показан в [3] синтез последовательности в [12]
А раз везде синтез то и программа будет синтезатор
Хотя может есть более подходящее название для программы сочиняющей музыку или кто знает такую

>guitarist   (17.12.05 20:25) [14]
>а вот, чтобы нажав на кнопку игралась одна нота, а при нажатии сразу же на другую -- другая.
>Предложенный вариант не проходит.

в [3] играет аккорд при одновременном нажатии на несколько кнопок 0..9,-,=
синтезируя звук и складывая его от всех нажатых в любое время кнопок
в [12] в начале такта запускает 2 midi команды причем в 1 канал
и звучание одной ноты длится весь такт вместе с другими нотами


 
suslik-lamer   (2005-12-19 20:44) [16]

[3] Действительно синтезатор, но гораздо больше интересует именно midi- синтезатор


 
programania ©   (2005-12-19 21:02) [17]

>Действительно синтезатор, но гораздо больше интересует именно midi- синтезатор

в [12] играет именно через midi устройство
но гораздо больше интересует использование midi устройства
именно как синтезатора звука хотя обычно его так не используют
но думаю если одновременно играть разные инструменты и
точно подобрать соотношение громкости и высоты
можно получить интересные эффекты



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.01 c
11-1126077378
Kozz
2005-09-07 11:16
2006.05.14
Кто-нибудь делал анимационную иконку в трее ?


2-1146048913
Meganop
2006-04-26 14:55
2006.05.14
Вызов exe


2-1145644332
Kostafey
2006-04-21 22:32
2006.05.14
Обрашение к биту данных


2-1145626164
suharew
2006-04-21 17:29
2006.05.14
Запись в Com порт в шестнадцатеричном формате


2-1145838896
Bratskiy
2006-04-24 04:34
2006.05.14
Резервное копирование базы данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский