MIDI w Delphi - pomoc dla zoltodzioba?

0

Witam,
Jestem zielony jak szczypiorek;-) To tyle o mnie - bo jestem tu nowy. Historia pewnie jakich wiele (mam nadzieje ;-) ) Po latach postanowilem wrocic do amatorskiego programowania - kiedys Turbo Pascal. I nieco sie gubie w Object Pascalu... Wprawdzie kupilem juz chyba z 5 ksiazek ;-) , w tym 'Kompendium programisty' (stad znalazlem sie na tym forum), ale tam o MIDI nie znalazlem wiele. Proste rzeczy potrafie sobie sklecic - dla wlasnej radochy - Delphi 6 Personal. Jestem muzykiem i ta dzialka gnebi mnie najbardziej. W czasach Turbo Pascala zrobilem sobie kilka prostych narzedzi pracujacych z MIDI. Teraz mam problem. Przeszukalem te stronke i natrafilem na komponenty MIDI, ale nie moge ich zainstalowac z powodu braku vcl50.bpl ( [???] ). Wiec chcialbym sprobowac inaczej. Czy moze ktos zasugerowac mi od czego zaczac?

Pozdrowienia dla forumowiczow,
Jacek
[email protected]

0

Ja też zaczołem teraz to rozgryzać i próbuje to robić bez komponentów. Z tego co już wiem należy uzywać funcji API (uses MMSystem) wszystkie zaczynające się na midi....

np.
//liczba urządzeń MIDI

i:=midiInGetNumDevs();//liczba urządzeń MIDI IN
j:=midiOutGetNumDevs();//liczba urządzeń MIDI OUT

// informacje o porcie MIDI OUT
DeviceID:=1;//wartości które są związane z j

FError := midiOutGetDevCaps(DeviceID, @midioutCaps, sizeof(TmidioutCaps));
with midiOutCaps do
begin
FProductName := StrPas(szPname);
FDriverVersion := vDriverVersion;
FTechnology := wTechnology;
FVoices := wVoices;
FNotes := wNotes;
FChannelMask := wChannelMask;
FSupport := dwSupport;
end;
Label15.Caption:='ProductName:'+' '+FProductName;
Label16.Caption:='DriverVersion:'+' '+IntToStr(FDriverVersion);

yy:='';
case FTechnology of
MOD_FMSYNTH: yy:='MOD_FMSYNTH';
MOD_MAPPER: yy:='MOD_MAPPER';
MOD_MIDIPORT: yy:='MOD_MIDIPORT';
MOD_SQSYNTH: yy:='MOD_SQSYNTH';
MOD_SYNTH: yy:='MOD_SYNTH';
end;

Label21.Caption:='Technology:'+' '+yy;

Label17.Caption:='Voices:'+' '+IntToStr(FVoices);
Label18.Caption:='Notes (polyphony):'+' '+IntToStr(FNotes);
Label19.Caption:='ChannelMask:'+' '+IntToStr(FChannelMask);//nie tak do końca
yy:='';
case FSupport of
MIDICAPS_CACHE: yy:='MIDICAPS_CACHE';
MIDICAPS_LRVOLUME: yy:='MIDICAPS_LRVOLUME';
MIDICAPS_STREAM: yy:='MIDICAPS_STREAM';
MIDICAPS_VOLUME: yy:='MIDICAPS_VOLUME';
end;

Label20.Caption:='Support:'+' '+yy+IntTostr(FSupport);

//granie nut

//otwierani portu midi (zamiast MIDIMAPPER można 0 lub 1 - patrz zmienna j)
case midiOutOpen(@hmo, MIDIMAPPER, 0, 0, 0) of
//case midiOutOpen(@hmo, 0, 0, 0, 0) of
MMSYSERR_NOERROR: showmessage('port midi out jest otwarty!!');
MIDIERR_NODEVICE: showmessage('No MIDI port was found. This error occurs only when the mapper is opened');
MMSYSERR_ALLOCATED: showmessage('The specified resource is already allocated.');
MMSYSERR_BADDEVICEID: showmessage('The specified device identifier is out of range.');
MMSYSERR_INVALPARAM: showmessage('The specified pointer or structure is invalid.');
MMSYSERR_NOMEM: showmessage('The system is unable to allocate or lock memory.');
end;

//wysłanie komunikatu żeby zagrał - 9, na kanale - 5, nutę - 3C, z siłą - 7F

dwMSG:=StrToInt('0x007F3C95');

case midiOutShortMsg(hmo,dwMSG) of
MMSYSERR_NOERROR: showmessage('jest ok');
MIDIERR_BADOPENMODE: showmessage('midiOutMsg - MIDIERR_BADOPENMODE');
MIDIERR_NOTREADY: showmessage('midiOutMsg - MIDIERR_NOTREADY');
MMSYSERR_INVALHANDLE: showmessage('midiOutMsg - MMSYSERR_INVALHANDLE');

end;

Myslę że trochę teraz będzie jaśniej

0

Ja korzystałem z konpomentów na Torry.net
Jest tam tego od groma.
Jednak według mnie najlepsze bibioteki to MxMidi.dll, jednak one nie są freeware ;-(

0

Tomasz: Dzięki za zainteresowanie. Napotkałem na kilka prolemów w Twoim kodzie. Może mi napisać deklarację zmiennych - nie wiem, jakiego typu powinny być (np. Technology).

Jacek

0

Dla JackaH: Poniżej deklaracje zmiennych jakich używałem w tym programiku, jak to wrzucisz powinno zadziałać w razie problemów pisz na [email protected]

var
i,j: integer;

DEVICEID: WORD;
FError: Word; { Last MMSYSTEM error }
midioutCaps: TmidioutCaps;
FProductName: string; { product name }
FDriverVersion: Version; { Driver version from midioutGetDevCaps }
FTechnology: Word; { Type of MIDI output device }
FVoices: Word; { Number of voices (internal synth) }
FNotes: Word; { Number of notes (internal synth) }
FChannelMask: Word; { Bit set for each MIDI channels that the
device responds to (internal synth) }
FSupport: DWORD; { Technology supported (volume control,
patch caching etc. }

xx,yy: string;
dwMsg: DWORD; //komunikat midi
hmo: HMIDIOUT;
tc: TIMECAPS;
timer_res: integer;
uTimerRes,uTimerID: UINT;
czas1: integer;

0

Poszukaj sobie na Torry.net Bass-a albo lepiej AudioObject-a - sam korzystam, i jak dla mnie tuż koło FModa jest najlepsze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1