Forum » Programiranje » Katerikoli programski jezik - Windows - MIDI vprašanje
Katerikoli programski jezik - Windows - MIDI vprašanje
PecenkA ::
Rad bi v realnem času spreminjal MIDI note, ki jih dobim recimo iz klaviature na midi in v računalniku. Gre se pa za mapiranje not glede na jakost. Recimo noto E2 z jakostjo 54 bi pustil tako kot je, isto noto E2 samo z jakostjo večjo od 87 pa bi premapiral na npr. C4 z jakostjo 87. Končna aplikacija, bi potem dobila modificirano noto. Ali lahko kdo priporoči kakšno MIDI knjižnico, ki bi to omogočala?
MrBrdo ::
V vsakem primeru bi se tega lotil v C++. Primer WinAPI wrapperja za MIDI: http://www.codeproject.com/KB/audio-vid...
Sedaj, če hočeš spreminjati vhod imaš po moje 2 možnosti:
1. Bereš iz prave naprave in ustvariš virtualno, kamor "kopiraš" vhod in ga po potrebi spremeniš. Malo pogooglaj, če se da naredit virtualni MIDI device. Očitno MORAŠ napisat driver (ali pa uporabit že napisan driver ki omogoča kar želiš).
http://www.google.si/search?sourceid=ch...
http://www.midiox.com/ - tole bi ti znalo pomagat, če sploh dela na novih winsih (ker zgleda zadeva malo stara). če prav razumem funkcionalnost programa, lahko ti napišeš svoj program, kjer bereš input iz MIDIja (lahko uporabiš wrapper ki sem ga linkal na vrhu), potem pa pišeš v midi output ("kopiraš" ali spremeniš). ta program ti bo ta output spremenil v input ki ga lahko izbereš v drugem programu.
v kolikor zgornji program ne dela oz si želiš malo bolj prilagojene rešitve lahko pogledaš izvorno kodo od http://bassmididrv.mudlord.info/ - to je že napisan driver, ki ga verjetno z malo prilagajanja lahko uporabiš da narediš kar želiš.
2. Če se lahko omejiš na nek en ali več določenih programov (npr. nek avdio program ki bere midi), lahko uporabiš DLL Injection in API Hooking. Za injection si pogooglaj nekaj v smislu CreateRemoteThread injection, za API Hooking pa lahko uporabiš MS Detours knjižnico.
Ideja 2) je v tem, da napišeš DLL, ki ga injectaš v ciljno aplikacijo, kar pomeni da se DLL naloži v tisto aplikacijo. Ko si enkrat "noter", lahko uporabiš API hooking, da "preusmeriš" klice na določen API na neko svojo funkcijo, kjer lahko podatke pregledaš in spreminjaš.
Na hitro pogledano bi moral hookat midiInOpen http://msdn.microsoft.com/en-us/library... in spremenit parameter dwCallback na neko svojo funkcijo v DLLju, originalno pa si shraniš v pointer in jo potem kličeš iz te svoje funkcije, z po potrebi spremenjenimi podatki.
v zelo poenostavljeni psevdokodi:
V primeru da program večkrat kliče midiInOpen moraš seveda pazit, da si shraniš vse callbacke v nekem hashmapu (za key lahko uporabiš po klicu originalne funkcije parameter lphMidiIn, ki je handle).
V glavnem zadeva ni full komplicirana če si dober v programiranju, če pa si začetnik pa je verjetno to prevelik zalogaj.
Aja PS dvomim da obstaja knjižnica, ki bi to že omogočala out-of-the-box
Sedaj, če hočeš spreminjati vhod imaš po moje 2 možnosti:
1. Bereš iz prave naprave in ustvariš virtualno, kamor "kopiraš" vhod in ga po potrebi spremeniš. Malo pogooglaj, če se da naredit virtualni MIDI device. Očitno MORAŠ napisat driver (ali pa uporabit že napisan driver ki omogoča kar želiš).
http://www.google.si/search?sourceid=ch...
http://www.midiox.com/ - tole bi ti znalo pomagat, če sploh dela na novih winsih (ker zgleda zadeva malo stara). če prav razumem funkcionalnost programa, lahko ti napišeš svoj program, kjer bereš input iz MIDIja (lahko uporabiš wrapper ki sem ga linkal na vrhu), potem pa pišeš v midi output ("kopiraš" ali spremeniš). ta program ti bo ta output spremenil v input ki ga lahko izbereš v drugem programu.
v kolikor zgornji program ne dela oz si želiš malo bolj prilagojene rešitve lahko pogledaš izvorno kodo od http://bassmididrv.mudlord.info/ - to je že napisan driver, ki ga verjetno z malo prilagajanja lahko uporabiš da narediš kar želiš.
2. Če se lahko omejiš na nek en ali več določenih programov (npr. nek avdio program ki bere midi), lahko uporabiš DLL Injection in API Hooking. Za injection si pogooglaj nekaj v smislu CreateRemoteThread injection, za API Hooking pa lahko uporabiš MS Detours knjižnico.
Ideja 2) je v tem, da napišeš DLL, ki ga injectaš v ciljno aplikacijo, kar pomeni da se DLL naloži v tisto aplikacijo. Ko si enkrat "noter", lahko uporabiš API hooking, da "preusmeriš" klice na določen API na neko svojo funkcijo, kjer lahko podatke pregledaš in spreminjaš.
Na hitro pogledano bi moral hookat midiInOpen http://msdn.microsoft.com/en-us/library... in spremenit parameter dwCallback na neko svojo funkcijo v DLLju, originalno pa si shraniš v pointer in jo potem kličeš iz te svoje funkcije, z po potrebi spremenjenimi podatki.
v zelo poenostavljeni psevdokodi:
var midiInOpenOrig; var origCallback; mycallback(...) { // spremeni podatke return origCallback(...); } midiInOpenHook(... dwCallback) { origCallback = dwCallback; return midiInOpenOrig(.... &mycallback); } ondllloaded() { hookapi(midiInOpen, midiInOpenHook, midiInOpenOrig); }
V primeru da program večkrat kliče midiInOpen moraš seveda pazit, da si shraniš vse callbacke v nekem hashmapu (za key lahko uporabiš po klicu originalne funkcije parameter lphMidiIn, ki je handle).
V glavnem zadeva ni full komplicirana če si dober v programiranju, če pa si začetnik pa je verjetno to prevelik zalogaj.
Aja PS dvomim da obstaja knjižnica, ki bi to že omogočala out-of-the-box
MrBrdo
Zgodovina sprememb…
- spremenilo: MrBrdo ()
PecenkA ::
@MrBrdo
Hvala za odgovor. Sem pa potem že sam našel rešitev ta čas. Sem pa zadevo pustil stati čez novo leto. Za domačo uporabo je zastonj LoopBe1 program, ki ti naredi virtualni MIDI input in output device. Poleg tega sem pa napisal program, ki na hardverskem MIDI interfacu intercepta vhodne evente in jih potem spremenjene pošilja na virtualnega. Sprobal pa še nisem, ker se ravno selim, pa nimam možnosti. Ma da dela iz prve . Delal sem v delphiju s knjižnico na http://bitbucket.org/h4ndy/midiio-dev samo link trenutno ne dela.
Hvala za odgovor. Sem pa potem že sam našel rešitev ta čas. Sem pa zadevo pustil stati čez novo leto. Za domačo uporabo je zastonj LoopBe1 program, ki ti naredi virtualni MIDI input in output device. Poleg tega sem pa napisal program, ki na hardverskem MIDI interfacu intercepta vhodne evente in jih potem spremenjene pošilja na virtualnega. Sprobal pa še nisem, ker se ravno selim, pa nimam možnosti. Ma da dela iz prve . Delal sem v delphiju s knjižnico na http://bitbucket.org/h4ndy/midiio-dev samo link trenutno ne dela.
Zgodovina sprememb…
- spremenil: PecenkA ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | API hookingOddelek: Informacijska varnost | 810 (659) | BlueRunner |
» | [WinXP] Povezava MIDI tipkovnice z računalnikomOddelek: Pomoč in nasveti | 2200 (2101) | midiboss |
» | Audigy soundfont ali kaj boljšega-profi???Oddelek: Pomoč in nasveti | 2161 (1784) | matrix2 |
» | [.NET] vohunjenje za API kliciOddelek: Programiranje | 2720 (1201) | t909 |
» | Music StuffOddelek: Zvok in slika | 1974 (1791) | Tr0n |