Работаем с Midi
Участников: 3
Страница 1 из 1
Работаем с Midi
вот как обычно, полезности с оф форума. воспроизведение Midi нот.
http://freebasic.net/forum/viewtopic.php?p=109236
программа воспроизводит две гаммы, до мажор, и до минор, с помощью стандартной windows мултимедия библиотеки "Mmsystem".
может кому сгодится для игрушек, маленькая подзвучка событий.
пара коментариев, отвечающих за команды нот и воспроизведение их, помечены по русски.
код:
#Include "windows.bi"
#INCLUDE ONCE "WIN\MMSYSTEM.BI"
' all bytes in message bit 7 unset except first one (status byte)
'
'midi messages length 1 (status) 2 3
' note off 3 &h80+channel pitch vel
' note on 3 &h90+channel pitch vel
' program change 2 &hC0+channel preset nr
'channel=voice 0 to 15
' pitch= key 0 to 127 middle C=60
'velocity 1 127 standard keyboard=64
#define mid_noteoff &h80 'выключает звук ноты
#define mid_noteon &h90 'dключает звучание ноты
#define mid_prchange &hC0
'команды мажор гаммы
'C D E F G A B C
Dim Shared majscale(7) As Integer={60,62,64,65,67,69,71,72}
'команды минор гаммы
'C D Eb F G A Bb C
Dim Shared minscale(7) As Integer={60,62,63,65,67,69,70,72}
Union midimsg
dw As Uinteger
b(3) As Ubyte
End Union
Type midisystem
hmidiout As hmidiout
As Integer herror,patch
mm As midimsg
Declare Constructor()
Declare Destructor()
Declare Sub playnote (note As Integer, duration As Integer)
Declare Sub setpatch(patch As Integer)
End Type
Constructor midisystem()
Dim As Integer n=midiOutGetNumDevs
If n=0 Then herror=-1
herror= midiOutOpen(@hMidiOut , -1, 0, 0, 0)
If hmidiout=0 Then herror=-2
setpatch 25
End Constructor
Destructor midisystem()
midiOutClose(hMidiOut)
midiOutReset(hMidiOut)
End Destructor
'процедура воспроизводящая ноту, параметры: midisystem.Playnote (нота, длина)
Sub midisystem.Playnote (note As Integer,duration As Integer)
Dim As Integer x
mm.b(0)=mid_noteon
mm.b(1)=note
mm.b(2)=64
X = midiOutShortMsg(hMidiOut,mm.dw )
Print x
Dim t As Single=Timer+duration/1000
Do:Loop Until Timer>t
mm.b(0)=mid_noteoff
x= midiOutShortMsg(hMidiOut,mm.dw)
End Sub
'процедура выбора звуков(инструментов от 0 до 127
Sub midisystem.setpatch(patch As Integer)
mm.b(0)=mid_prchange
mm.b(1)=patch
midiOutShortMsg(hMidiOut,mm.dw )
End Sub
'процедура для воспроизведения ряда нот
Sub playscale(m As midisystem Ptr,p As Integer Ptr, n As Integer)
For i As Integer=0 To 7
m->playnote(p[i],600)
Sleep 100
Next
End Sub
Dim As midisystem Ptr m =New midisystem
Print m->herror
If m->herror=0 Then
Dim As Integer Ptr p
'играем мажор гамму
?"Playing a major scale"
playscale(m,@majscale(0),
Sleep 1000
'играем минор гамму
?"Playing a minor scale"
playscale(m,@minscale(0),
End If
Delete m
Print "ended"
Sleep
http://freebasic.net/forum/viewtopic.php?p=109236
программа воспроизводит две гаммы, до мажор, и до минор, с помощью стандартной windows мултимедия библиотеки "Mmsystem".
может кому сгодится для игрушек, маленькая подзвучка событий.
пара коментариев, отвечающих за команды нот и воспроизведение их, помечены по русски.
код:
#Include "windows.bi"
#INCLUDE ONCE "WIN\MMSYSTEM.BI"
' all bytes in message bit 7 unset except first one (status byte)
'
'midi messages length 1 (status) 2 3
' note off 3 &h80+channel pitch vel
' note on 3 &h90+channel pitch vel
' program change 2 &hC0+channel preset nr
'channel=voice 0 to 15
' pitch= key 0 to 127 middle C=60
'velocity 1 127 standard keyboard=64
#define mid_noteoff &h80 'выключает звук ноты
#define mid_noteon &h90 'dключает звучание ноты
#define mid_prchange &hC0
'команды мажор гаммы
'C D E F G A B C
Dim Shared majscale(7) As Integer={60,62,64,65,67,69,71,72}
'команды минор гаммы
'C D Eb F G A Bb C
Dim Shared minscale(7) As Integer={60,62,63,65,67,69,70,72}
Union midimsg
dw As Uinteger
b(3) As Ubyte
End Union
Type midisystem
hmidiout As hmidiout
As Integer herror,patch
mm As midimsg
Declare Constructor()
Declare Destructor()
Declare Sub playnote (note As Integer, duration As Integer)
Declare Sub setpatch(patch As Integer)
End Type
Constructor midisystem()
Dim As Integer n=midiOutGetNumDevs
If n=0 Then herror=-1
herror= midiOutOpen(@hMidiOut , -1, 0, 0, 0)
If hmidiout=0 Then herror=-2
setpatch 25
End Constructor
Destructor midisystem()
midiOutClose(hMidiOut)
midiOutReset(hMidiOut)
End Destructor
'процедура воспроизводящая ноту, параметры: midisystem.Playnote (нота, длина)
Sub midisystem.Playnote (note As Integer,duration As Integer)
Dim As Integer x
mm.b(0)=mid_noteon
mm.b(1)=note
mm.b(2)=64
X = midiOutShortMsg(hMidiOut,mm.dw )
Print x
Dim t As Single=Timer+duration/1000
Do:Loop Until Timer>t
mm.b(0)=mid_noteoff
x= midiOutShortMsg(hMidiOut,mm.dw)
End Sub
'процедура выбора звуков(инструментов от 0 до 127
Sub midisystem.setpatch(patch As Integer)
mm.b(0)=mid_prchange
mm.b(1)=patch
midiOutShortMsg(hMidiOut,mm.dw )
End Sub
'процедура для воспроизведения ряда нот
Sub playscale(m As midisystem Ptr,p As Integer Ptr, n As Integer)
For i As Integer=0 To 7
m->playnote(p[i],600)
Sleep 100
Next
End Sub
Dim As midisystem Ptr m =New midisystem
Print m->herror
If m->herror=0 Then
Dim As Integer Ptr p
'играем мажор гамму
?"Playing a major scale"
playscale(m,@majscale(0),
Sleep 1000
'играем минор гамму
?"Playing a minor scale"
playscale(m,@minscale(0),
End If
Delete m
Print "ended"
Sleep
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Работаем с Midi
А теперь ещё кто бы объяснил, что значит "мажорная гамма" и "минорная гамма" я не помню. Слова знакомые, но и только.
А ещё лучше, если кто-нибудь напишет и выложит синтезатор, на манер импульс трекера.
Чтобы можно было потаптавшись по батонам с наслаждением послушать музыкальную фигню.
А ещё лучше, если кто-нибудь напишет и выложит синтезатор, на манер импульс трекера.
Чтобы можно было потаптавшись по батонам с наслаждением послушать музыкальную фигню.
Re: Работаем с Midi
Ну это просто Мажорная - построенная от основной ноты. Минорная - построенная от бемоля (пол тона ниже от основной ноты)
justar- Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 49
Откуда : Кишинёв, Республика Молдоа
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|