» »

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:
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.

Zgodovina sprememb…

  • spremenil: PecenkA ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

API hooking

Oddelek: Informacijska varnost
9810 (659) BlueRunner
»

[WinXP] Povezava MIDI tipkovnice z računalnikom

Oddelek: Pomoč in nasveti
82200 (2101) midiboss
»

Audigy soundfont ali kaj boljšega-profi???

Oddelek: Pomoč in nasveti
352161 (1784) matrix2
»

[.NET] vohunjenje za API klici

Oddelek: Programiranje
212720 (1201) t909
»

Music Stuff

Oddelek: Zvok in slika
61974 (1791) Tr0n

Več podobnih tem