2010-09-06 93 views

回答

2

我一直在使用這些組件ages

http://bitbucket.org/h4ndy/midiio-dev

他們幾乎從未失敗過,而且與許多其他已經存在很長時間的專用Delphi組件不同,這些代碼非常活躍(最近增加了更新和改進)。

沒有什麼特別的,但它很容易使用,快速,堅如磐石。如果你打算做嚴重的midi的東西,你最終會最終使用這個。

4

你確定你確實需要第三方庫嗎?如果您的需求是基本的,那麼Windows API就是您需要的(using MMSystem)。

var 
    mo: HMIDIOUT; 

const 
    MIDI_NOTE_ON = $90; 
    MIDI_NOTE_OFF = $80; 
    MIDI_CHANGE_INSTRUMENT = $C0; 
    MIDI_DEVICE = 0; 
    MIDI_VEL = 108; 

procedure MIDIInit; 
begin 
    midiOutOpen(@mo, MIDI_DEVICE, 0, 0, CALLBACK_NULL); 
    SetPlaybackVolume($FFFFFFFF); 
end; 

function MIDIEncodeMessage(Msg, Param1, Param2: integer): integer; 
begin 
    result := Msg + (Param1 shl 8) + (Param2 shl 16); 
end; 

procedure SetCurrentInstrument(CurrentInstrument: TMIDIInstrument); 
begin 
    midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_CHANGE_INSTRUMENT, ord(CurrentInstrument), 0)); 
end; 

procedure NoteOn(NewNote, NewIntensity: byte); 
begin 
    midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_NOTE_ON, NewNote, NewIntensity)); 
end; 

procedure NoteOff(NewNote, NewIntensity: byte); 
begin 
    midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_NOTE_OFF, NewNote, NewIntensity)); 
end; 

procedure SetPlaybackVolume(PlaybackVolume: cardinal); 
begin 
    midiOutSetVolume(mo, PlaybackVolume); 
end; 

在儀器

type 
    TMIDIInstrument = (midiAcousticGrandPiano, midiBrightAcousticPiano, 
        midiElectricGrandPiano, midiHonkyTonkPiano, 
        midiRhodesPiano, midiChorusedPiano, midiHarpsichord, 
        midiClavinet, midiCelesta, midiGlockenspiel, 
        midiMusicBox, midiVibraphone, midiMarimba, midiXylophone, 
        midiTubularBells, midiDulcimer, midiHammondOrgan, 
        midiPercussiveOrgan, midiRockOrgan, midiChurchOrgan, 
        midiReedOrgan, midiAccordion, midiHarmonica, 
        midiTangoAccordion, midiAcousticGuitarNylon, 
        midiAcousticGuitarSteel, midiElectricGuitarJazz, 
        midiElectricGuitarClean, midiElectricGuitarMuted, 
        midiOverdrivenGuitar, midiDistortionGuitar, 
        midiGuitarHarmonics, midiAcousticBass, midiElectricBassFinger, 
        midiElectricBassPick, midiFretlessBass, midiSlapBass1, 
        midiSlapBass2, midiSynthBass1, midiSynthBass2, midiViolin, 
        midiViola, midiCello, midiContrabass, midiTremoloStrings, 
        midiPizzicatoStrings, midiOrchestralHarp, midiTimpani, 
        midiStringEnsemble1, midiStringEnsemble2, midiSynthStrings1, 
        midiSynthStrings2, midiChoirAahs, midiVoiceOohs, 
        midiSynthVoice, midiOrchestraHit, midiTrumpet, midiTrombone, 
        midiTuba, midiMutedTrumpet, midiFrenchHorn, midiBrassSection, 
        midiSynthBrass1, midiSynthBrass2, midiSopranoSax, midiAltoSax, 
        midiTenorSax, midiBaritoneSax, midiOboe, midiEnglishHorn, 
        midiBassoon, midiClarinet, midiPiccolo, midiFlute, 
        midiRecorder, midiPanFlute, midiBottleBlow, midiShakuhachi, 
        midiWhistle, midiOcarina, midiLead1Square, 
        midiLead2Sawtooth, midiLead3CalliopeLead, midiLead4ChiffLead, 
        midiLead5Charang, midiLead6Voice, midiLead7Fifths, 
        midiLead8BrassLead, midiPad1NewAge, midiPad2Warm, 
        midiPad3Polysynth, midiPad4Choir, midiPad5Bowed, 
        midiPad6Metallic, midiPad7Halo, midiPad8Sweep, midiEmpty0, 
        midiEmpty1, midiEmpty2, midiEmpty3, midiEmpty4, midiEmpty5, 
        midiEmpty6, midiEmpty7, midiEmpty8, midiEmpty9, midiEmpty10, 
        midiEmpty11, midiEmpty12, midiEmpty13, midiEmpty14, 
        midiEmpty15, midiEmpty16, midiEmpty17, midiEmpty18, 
        midiEmpty19, midiEmpty20, midiEmpty21, midiEmpty22, 
        midiEmpty23, midiGuitarFretNoise, midiBreathNoise, 
        midiSeashore, midiBirdTweet, midiTelephoneRing, 
        midiHelicopter, midiApplause, midiGunshot); 

試試這個:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    MIDIInit; 
    SetCurrentInstrument(midiHarmonica); 
    NoteOn(50, 127); 
    sleep(200); 
    NoteOn(60, 127); 
    sleep(200); 
    NoteOn(70, 127); 
    sleep(200); 
    NoteOff(70, 127); 
    NoteOff(60, 127); 
    NoteOff(50, 127); 
    SetCurrentInstrument(midiAcousticGrandPiano); 
    NoteOn(70, 127); 
    NoteOn(80, 127); 

    sleep(1000); 
    SetCurrentInstrument(midiApplause); 
    NoteOn(64, 127); 
    sleep(2000); 
    NoteOff(64, 127); 
end; 
+0

+1非常有用的帖子。 – 2011-06-15 10:05:33

+0

你好。我不知道如何提出一個關於這個問題的問題..我測試que代碼..如果我試圖把它放到一個buttonEvent ..它只是工作一次..我如何重新設置它?隨時隨地發聲嗎?謝謝 – Pericles 2013-12-10 21:36:40

1

只是一個小額外的信息:SourceForge「dmidi」項目實際上與BitBucket上的「midiio」相同(但發展在這裏發生)。

0

星期一2014年4月14日9:49。由於我不允許發表評論,因此我會嘗試回答:我爲midimountain.com候選人投了我的生活在過去的投票。我得到了demo_MidiDevices_D6.zip(獲取它的頁面http://www.midimountain.com/delphi_midi.html,而不是的「下載」鏈接),解壓縮它,然後編譯我的古董Delphi 7和運行。我還沒有真正測試過它是否會使用MIDI,但它確實顯示了我附屬的MIDI設備的動畫片....