 |
AutoHotkey Community Let's help each other out
|
| View previous topic :: View next topic |
| Author |
Message |
rockum
Joined: 20 Dec 2007 Posts: 22
|
Posted: Mon Mar 24, 2008 4:02 pm Post subject: |
|
|
| Add me to the list of those desiring integrated MIDI input and output. |
|
| Back to top |
|
 |
orbik
Joined: 09 Apr 2008 Posts: 35 Location: Espoo, Finland
|
Posted: Wed Apr 09, 2008 3:51 pm Post subject: |
|
|
Hello.
I've been wanting MIDI input for some time and given the lack of progress I had to try something myself. Ok, so I downloaded the source and thought it shouldn't need much change to implement it. But despite the heavy level of commenting in the code I couldn't quite grasp how it worked (I'd certainly like a more centralized documentation starting with an overview) as I'm not really an experienced programmer.
Next I tried Anatoly Larkin's method but couldn't quite get it work reasonably. For some reason after giving the callback function address to midiInOpen, the midi in driver almost came to a halt.
But you can make the midi driver send windows messages to the script instead of directly calling a function. Just replace the function address with a window handle and CALLBACK_FUNCTION with CALLBACK_WINDOW.
So far it seems you can't get the script's own window handle from within (let's add that to the wishlist, maybe a new built in variable.. A_ScriptHWND?), but by searching these forums I figured you can use a Gui window just as well:
| Code: | Gui +LastFound
hWnd := WinExist() |
So I pieced together a script that finally after realizing I need to *start* the device as well as open it , so far works without problems.
In fact the small mistake caused me quite a headache.. I already wrote a simple dll in the hopes it would work better. Though I had never wrote a single dll before (or anything concerning midi) but fortunately it's not very complicated.
Now the dll works too and I intend to work on it, but anyway here's the ahk script using winmm.dll directly: (needs more comments, i know but i'm lazy )
| Code: |
;;"#defines"
DeviceID := 0
CALLBACK_WINDOW := 0x10000
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#Persistent
Gui, +LastFound
hWnd := WinExist()
MsgBox, hWnd = %hWnd%`nPress OK to open winmm.dll library
OpenCloseMidiAPI()
OnExit, Sub_Exit
MsgBox, winmm.dll loaded.`nPress OK to open midi device`nDevice ID = %DeviceID%`nhWnd = %hWnd%`ndwFlags = CALLBACK_WINDOW
hMidiIn =
VarSetCapacity(hMidiIn, 4, 0)
result := DllCall("winmm.dll\midiInOpen", UInt,&hMidiIn, UInt,DeviceID, UInt,hWnd, UInt,0, UInt,CALLBACK_WINDOW, "UInt")
If result
{
MsgBox, error, midiInOpen returned %result%`n
GoSub, sub_exit
}
hMidiIn := NumGet(hMidiIn) ; because midiInOpen writes the value in 32 bit binary number, AHK stores it as a string
MsgBox, Midi input device opened successfully`nhMidiIn = %hMidiIn%`n`nPress OK to start the midi device
result := DllCall("winmm.dll\midiInStart", UInt,hMidiIn)
If result
{
MsgBox, error, midiInStart returned %result%`n
GoSub, sub_exit
}
; #define MM_MIM_OPEN 0x3C1 /* MIDI input */
; #define MM_MIM_CLOSE 0x3C2
; #define MM_MIM_DATA 0x3C3
; #define MM_MIM_LONGDATA 0x3C4
; #define MM_MIM_ERROR 0x3C5
; #define MM_MIM_LONGERROR 0x3C6
OnMessage(0x3C1, "midiInHandler")
OnMessage(0x3C2, "midiInHandler")
OnMessage(0x3C3, "midiInHandler")
OnMessage(0x3C4, "midiInHandler")
OnMessage(0x3C5, "midiInHandler")
OnMessage(0x3C6, "midiInHandler")
return
sub_exit:
If (hMidiIn)
DllCall("winmm.dll\midiInClose", UInt,hMidiIn)
OpenCloseMidiAPI()
ExitApp
;--------End of auto-execute section-----
;----------------------------------------
OpenCloseMidiAPI() {
Static hModule
If hModule
DllCall("FreeLibrary", UInt,hModule), hModule := ""
If (0 = hModule := DllCall("LoadLibrary",Str,"winmm.dll")) {
MsgBox Cannot load library winmm.dll
ExitApp
}
}
midiInHandler(hInput, midiMsg, wMsg)
{
statusbyte := midiMsg & 0xFF
byte1 := (midiMsg >> 8) & 0xFF
byte2 := (midiMsg >> 16) & 0xFF
ToolTip,
(
Received a message: %wMsg%
wParam = %hInput%
lParam = %midiMsg%
statusbyte = %statusbyte%
byte1 = %byte1%
byte2 = %byte2%
)
}
Esc::GoSub, sub_exit
|
My dll approach is a bit different. The idea was to have the dll call a specified window with messages specified separately for each input type, note/cc number and channel, and then only send messages where it's specified. And since I doubt the code tag would display c++ code properly, i put all relevant files to http://ihme.org/~orbik/midi4ahk/
Some parts of the scripts are borrowed from various fellow ahk users, and I wish I remembered who they were. |
|
| Back to top |
|
 |
orbik
Joined: 09 Apr 2008 Posts: 35 Location: Espoo, Finland
|
Posted: Fri Apr 11, 2008 8:54 am Post subject: |
|
|
Time for an update:
Seems that the hardest part of midi input in AutoHotkey is making the definition of "midi hotkeys" less painful. So I don't think there's anything short of full integration to the script engine, that would help here.
EDIT:
Message bulk moved to http://www.autohotkey.com/forum/viewtopic.php?t=30715 |
|
| Back to top |
|
 |
autohotkeynutzer1962
Joined: 17 Mar 2011 Posts: 3
|
Posted: Thu Mar 17, 2011 7:03 am Post subject: |
|
|
Hi friends,
I am not very well in the english language and I hope, I get some answers, that I will understand. It seems to me, that the theme here is about the theme, but I understand not much, cause my english lessons from school are to long ago
My problem is the following thing:
I want to send a midicontrol order by using autohotkey, over my USB Midi-interface to an effectprocessor. Thats it.
It seems to me, that here I could find the solution of my problem.
Is there somebody, who can write me the neccessary skript?
Thank you very very much. |
|
| Back to top |
|
 |
autohotkeynutzer1962
Joined: 17 Mar 2011 Posts: 3
|
Posted: Fri Mar 18, 2011 7:17 am Post subject: |
|
|
ok, I just copied the scripts and it works. Hmmmm, sometimes it helps, if nobody answers.
But now I have a question, that I can not answer, cause I have no idea where I can find it, and the searchfunction gave no results.
In the script: Single Midi Event Example is a simple Note sent to the keyboard.
But how do I have to change the script, if I want to send an order to the modulation wheel?
Thanks for answering. |
|
| Back to top |
|
 |
|
|
You can post new topics in this forum You can reply to topics in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|