Форум: "Media";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
ВнизКак проиграть ноту Найти похожие ветки
← →
Oxy (2003-03-18 10:00) [0]Короче мне надо проиграть какую либо ноту. У меня есть таблица нот и требуется ф-ция (не знаю есть ли такая стандартная) для воспроизведения звука с частотой X герц.
Или подскажите как работать с MIDI, непосредственно с нотами.
← →
Digitman (2003-03-18 11:24) [1]какое отношение MIDI имеет к "короче" частоте ? MIDI-нота - это команда управления синтезатором, и частота твоя ему (синтезатору) не требуется вовсе, синтезатор сам знает, как ее сгенерировать
← →
AlexKniga (2003-03-18 11:43) [2]
Unit Music;
{--------------------------}Interface
Var Duration: Word;
{Type TNote=(Pause,
C1, Cs1, D1, Ds1, E1, F1, Fs1, G1, Gs1, A1, As1, B1,
C2, Cs2, D2, Ds2, E2, F2, Fs2, G2, Gs2, A2, As2, B2);}
Type TNote=(Pause,
Do1, DoD1, Re1, ReD1, Mi1, Fa1, FaD1, Sol1,SolD1,La1, LaD1, Si1,
Do2, DoD2, Re2, ReD2, Mi2, Fa2, FaD2, Sol2,SolD2,La2, LaD2, Si2);
{перечисление нот
*1, *2 - первая, вторая октавы
??D? (?s?) - диез (sharp)}
TDuration = Single;
TFullNote = Record
N: TNote; {Нота}
D: TDuration {Длительность}
End;
{Пример вся 1ая октава + До второй}
{Const Melody0: Array [1..8] of TFullNote =
( (N: Do1; D: 1), (N: Re1; D: 1), (N: Mi1; D: 1), (N: Fa1; D: 1),
(N: Sol1;D: 1), (N: La1; D: 1), (N: Si1; D: 1), (N: Do2; D: 1) );}
Procedure PlayNote (FullNote: TFullNote);
Procedure Play (Melody: Array of TFullNote);
{--------------------------}Implementation
Uses {CRT,} Utility;
Var Base, Trans: Double;
Procedure Sound(Frequency: Word);
Asm
push ebx
mov bx, ax
mov ax, 34DDh
mov dx, 0012h
cmp dx, bx
jnc @@2
div bx
mov bx, ax
in al, 61h
test al, 3
jnz @@1
or al, 3
out 61h, al
mov al, 0B6h
out 43h, al
@@1:
mov al, bl
out 42h, al
mov al, bh
out 42h, al
@@2:
pop ebx
End;
Procedure NoSound;
Asm
push ebx
in al, 61h
and al, 0FCh
out 61h, al
pop ebx
End;
Procedure Beep(Frequency, Duration: Integer);
Asm
push edx
push eax
mov eax, Win32Platform
cmp eax, VER_PLATFORM_WIN32_NT
jne @@9X
call Windows.Beep
ret
@@9X:
pop eax
pop edx
push ebx
push edx
mov bx, ax
mov ax, 34DDh
mov dx, 0012h
cmp dx, bx
jnc @@2
div bx
mov bx, ax
in al, 61h
test al, 3
jnz @@1
or al, 3
out 61h, al
mov al, 0B6h
out 43h, al
@@1:
mov al, bl
out 42h, al
mov al, bh
out 42h, al
call Windows.Sleep
in al, 61h
and al, 0FCh
out 61h, al
jmp @@3
@@2:
pop edx
@@3:
pop ebx
End;
Procedure PlayNote (FullNote: TFullNote);
Begin
With FullNote do
Begin
If N=Pause
Then NoSound
Else Sound( Round( Base * Stp(Trans, Ord(N)) ) );
Delay( Duration / D )
End
End;
Procedure Play (Melody: Array of TFullNote);
Var i: Word;
Begin
For i:=Low(Melody) to High(Melody) do
PlayNote(Melody[i]);
NoSound
End;
Begin
Trans:=Exp(Ln(2)/12);
Base:=440*Stp(Trans, -10);
Duration:= 400;
End.
← →
Oxy (2003-03-18 16:04) [3]2 Digitman ©
Мне надо вспроизводить именно ноты.Но я могу генерировать ноты сам используя ф-ю для воспроизведения звука частотой X герц. Но можно использовать и MIDI. Тогда емуляция не будет нужна. Весь вопрос в том как? Что для этого использовать, какие ф-ции и т.д.
2 AlexKniga
Спасибо, но это своими силами. А через стандартные виндовые API никак нельзя? Просто у меня есть опасения, что этот низкоуровневый код не обязательно будет работать под всеми виндами и на всех машинах.
← →
Oxy (2003-03-18 16:55) [4]2 AexKniga
А что за модуль Utility?
← →
Digitman (2003-03-19 08:49) [5]
> Oxy
на то есть готовая технология DXi... и готовые DXi-синтезаторы а-ля DreamStation от TTS ... DXi-синтезатор сам все сделает, достаточно управлять им по MIDI-интерфейсу
← →
[Baradoo] (2003-03-19 21:38) [6]Че за модуль UTILITY?
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c