![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Синтезатор на Delphi [D7, WinXP]
suslik-lamer © (2005-11-13 23:32:00)Как можно проиграть звук определенной высоты и инструмента (типа синтезатор) через колонки. Нигде не могу найти, как это реализовать
programania (2005-12-19 21:02:00) [1]>Действительно синтезатор, но гораздо больше интересует именно midi- синтезатор
в [12] играет именно через midi устройство
но гораздо больше интересует использование midi устройства
именно как синтезатора звука хотя обычно его так не используют
но думаю если одновременно играть разные инструменты и
точно подобрать соотношение громкости и высоты
можно получить интересные эффекты
suslik-lamer (2005-12-19 20:44:00) [2][3] Действительно синтезатор, но гораздо больше интересует именно midi- синтезатор
programania (2005-12-18 01:36:00) [3]>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 канал
и звучание одной ноты длится весь такт вместе с другими нотами
guitarist (2005-12-17 20:25:00) [4]Все-таки никто не может написать код синтезатора, а то бы и мне пригодилось, а претензию Digitman даже я понял -- последовательно играть несколько midi нот вроде уже понял как (наверное, это умно выражаясь и есть простейший MIDI-секвенсер), а вот, чтобы нажав на кнопку игралась одна нота, а при нажатии сразу же на другую -- другая. Предложенный вариант не проходит.
Digitman (2005-12-09 08:48:00) [5]
> programania
То что ты пытаешься втолковать автору, синтезатором как таковым не является.
Это у тебя - простейший MIDI-секвенсер.
Надеюсь, разница между синтезом собственно звука и синтезом управляющей MIDI-последовательности должна быть очевидна.
programania (2005-12-08 21:27:00) [6]>А можно если не трудно, обьяснить что каждая строка делает,
Поставьте в 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-08 16:57:00) [7]для сусликов индивидуально -
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1133854405&n=7
suslik-lamer (2005-12-07 22:32:00) [8]На самом деле все гораздо проще
А можно если не трудно, обьяснить что каждая строка делает, а то я в Delphi не такой мастер и не все пока понимаю.
Кстати, в TMidigen можно также организовать трелль, но только с помощью PlayString, ну хоть вот-так
MidiGen1.PlayString('I128, C, 5; E, 5; D,5;F,5');
Но такой вариант не проходит, т.к надо ждать нажатия клавиши и уж потом использовать PlayNote или Play
И еще одна просьба. Подкиньте пожалуйста ссылки на статьи о программированию Sound карты.
programania (2005-12-07 19:58:00) [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-06 22:17:00) [10]Огромное спасибо за последнюю ссылочку!
Вот только есть маленький вопрос. Если я хочу сделать синтезатор ударных, то не получается сделать быструю трелль, не успевает звук проиграться. Пытался в разные каналы подавать, но что-то не получается
TMidiGen (2005-11-28 16:18:00) [11]http://www.torry.net/quicksearchd.php?String=midigen&Title=Yes
TMidiGen
Anton_K (2005-11-26 22:12:00) [12]DirectMusic должен помочь.
suslik-lamer (2005-11-26 21:58:00) [13]Немного не то. Вот есть некий "программный синтезатор звуковой" и устройство MPU-401/ Хочется научиться их использовать. Помогите пожалуйста
suslik-lamer (2005-11-24 14:21:00) [14]Спасибо, посмотрю, попробую разобраться, если чего не пойму еще раз спрошу. Еще раз спасибо
programania (2005-11-23 22:09:00) [15]Вот недоделаный синтезатор
1 инструмент, delphi5, 1 октава на клавиши 0..9,-,=
и множество настроек
http://programania.com/syn.zip 7кб
suslik-lamer (2005-11-23 19:16:00) [16]А можно поподробней?
XProger (2005-11-14 02:48:00) [17]А в MSDN не пробовал искать?
mci* функции ;)