Форум: "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