Описание функции
Midi_Beep
Воспроизвести мелодию с помощью MIDI устройства.
Midi_Beep(Nota, Octave = 4, Duration = 200, Pause = 0)
Параметры
Nota | Нота от 1 до 12 внутри октавы |
Octave |
Номер октавы |
Duration |
Длительность звучания ноты в мсек |
Pause |
Пауза между нотами в мсек (отсутсвие звучания) |
Пример
; http://www.purebasic.fr/english/viewtopic.php?t=8107
; Автор обёрток движка MIDI: Cor, дата 29. October 2003
; Автор функции Midi_Beep и конвертации нот в соответствующий формат AZJIO
EnableExplicit
Global hMidiOut
; #Acoustic_Steel_Guitar = 25
#Channel1 = 1
; #Channel2 = 2
Declare StartTrack()
Global temp.f = 0.6 ; коэффициент темпа
Global Tone = 12
Global volume = 127 ; громкость 0-127
; обёртка миди сообщения
Procedure MidiOutMessage(hMidi, iStatus, iChannel, iData1, iData2)
Protected dwMessage = iStatus | iChannel | (iData1 << 8 ) | (iData2 << 16)
ProcedureReturn midiOutShortMsg_(hMidi, dwMessage) ;
EndProcedure
; Задать инструмент для канала
Procedure SetInstrument(channel, instrument)
MidiOutMessage(hMidiOut, $C0, channel, instrument, 0)
EndProcedure
Procedure Midi_Beep(nota, octave = 4, Duration = 200, PAUSE = 0)
Protected Frequency
nota = nota + Tone + 12*octave
; $90 + (nota * 256)
MidiOutMessage(hMidiOut, $90, #Channel1, nota , volume) ; включить ноту
Delay(Duration / temp)
MidiOutMessage(hMidiOut, $90, #Channel1, nota , 0) ; остановить ноту
If PAUSE <> 0
Delay(PAUSE / temp)
EndIf
EndProcedure
Define midi.MIDIOUTCAPS
Define devices = midiOutGetNumDevs_()
Define devnum, midiport
For devnum = -1 To devices - 1
If midiOutGetDevCaps_(devnum, @midi, SizeOf(MIDIOUTCAPS)) = 0
If midi\wVoices > 0
midiport = devnum
EndIf
EndIf
Next
Global hMidiOut
If midiOutOpen_(@hMidiOut, midiport, 0, 0, 0) = #MMSYSERR_NOERROR
; set acoustic steel guitar as instrument
; SetInstrument(#Channel1,#Acoustic_Steel_Guitar)
; SetInstrument(#Channel2,#Acoustic_Steel_Guitar)
StartTrack()
; end: reset instruments to 0 (default)
SetInstrument(#Channel1, 0)
; SetInstrument(#Channel2,0)
; end: close MIDI output
midiOutClose_(hMidiOut)
EndIf
Procedure StartTrack()
SetInstrument(#Channel1, 1) ; выбор музыкального инструмента
Midi_Beep(1, 4, 100)
Midi_Beep(5, 4, 100)
Midi_Beep(8, 4, 100)
Midi_Beep(1, 5, 100)
Midi_Beep(5, 5, 100)
Midi_Beep(8, 4, 100)
Midi_Beep(1, 5, 100)
Midi_Beep(5, 5, 100)
EndProcedure