Описание функции


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