2010-09-06 100 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设备的动画片....