Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Синтезатор на 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 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
2-1145894249
yaro
2006-04-24 19:57
2006.05.14
Таблица StringGrid


15-1145250056
Ega23
2006-04-17 09:00
2006.05.14
С Днём рождения! 17 апреля


2-1145964740
nyron
2006-04-25 15:32
2006.05.14
умножение


2-1145794625
mctarik
2006-04-23 16:17
2006.05.14
Учёт версии программы!


1-1144056863
misha_gr
2006-04-03 13:34
2006.05.14
Вопрос про ресурсы и про курсор (мышиный)