Что такое хорошая библиотека Delphi для ввода/вывода MIDI?Библиотека Delphi для ввода/вывода MIDI?
ответ
Я использую эти компоненты для ages:
http://bitbucket.org/h4ndy/midiio-dev
Они почти никогда не терпели неудачу, и в отличие от многих других специализированных компонентов Delphi, которые были вокруг в течение этого долгого времени, этот код в значительной степени жив (обновления и улучшения добавлены в последнее время).
Ничего необычного, но прост в использовании, быстро и прочно. Если вы планируете делать серьезные вещи midi, вы в конечном итоге в конечном итоге будете использовать это.
Я использовал BASS MIDI с помощью .NET обертку с большим успехом, и есть Delphi wrappers для него тоже.
Вы уверены, что вам действительно нужна сторонняя библиотека? Если ваши потребности носят базовый характер, API Windows - это все, что вам нужно (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;
очень простой MIDI вход/выход класс: www.midimountain.com/delphi_midi.html
Это выглядит как хорошая отправная точка, если вы хотите, чтобы свернуть свой собственный и использовать Windows API.
Просто небольшая дополнительная информация: Проект Sourceforge «dmidi» на самом деле тот же, что и «midiio» на BitBucket (но развитие происходит здесь).
Я использовал эти компоненты более 6 месяцев с большим успехом. Их следует оценивать со всеми остальными в последующих сообщениях.
пн 4/14/2014 9:49 утра. Поскольку мне не разрешают комментировать, я постараюсь ответить: я отдал свое голосование за живое в прошлом для кандидата midimountain.com. Я получил demo_MidiDevices_D6.zip (на странице http://www.midimountain.com/delphi_midi.html, не ссылка «скачать»), расстегнул его, и он скомпилирован без инцидентов в моем античном Delphi 7 и побежал. Я действительно не тестировал, если он делает MIDI, но он сделал показать мой звезду прикрепленных MIDI-устройств ....
+1 очень полезный пост. – 2011-06-15 10:05:33
Привет. Я не знаю, как задать вопрос по этому вопросу .. Я тестирую код que .. и если я попытаюсь поместить его в buttonEvent .. он просто работает один раз .. как я могу его переустановить? делать звук в любое время, когда я хочу? благодаря – Pericles