Re: Control selected track \w keyboard shortcuts
Posted: Fri Mar 12, 2021 4:52 pm
Thanks a lot!ace007 wrote: ↑Tue Jan 12, 2021 12:05 pmI made some minor changes to the python scripts of Selected Track Control.
For me it works now with Live 11 and python 3.
https://drive.google.com/file/d/1XpC4qC ... sp=sharing
Code: Select all
hModule := DllCall("kernel32\LoadLibrary", "Str","winmm", "Ptr")
vDeviceID := 1, hMIDIOutputDevice := 0 ; vdeviceid is the choice of midi channel
if DllCall("winmm\midiOutOpen", "Ptr*",hMIDIOutputDevice, "UInt",vDeviceID, "UPtr",0, "UPtr",0, "UInt",0, "UInt")
return
hDev := hMIDIOutputDevice
vChan := 0
;==============================
AW:= A_IsUnicode? "W": "A", A_CharSize:= A_IsUnicode? 2: 1
hWinMM:= DllCall("kernel32\LoadLibrary" AW, "Str", "Winmm.dll", "Ptr")
NumDevs:= DllCall("Winmm\midiOutGetNumDevs"), sz:= 20+32*A_CharSize
Loop, % NumDevs {
VarSetCapacity(DevCaps, sz, 0)
DllCall("Winmm\midiOutGetDevCaps" AW, "UInt", id:=A_Index-1, "Ptr", &DevCaps, "UInt", sz)
Name:= StrGet(&DevCaps+8)
DevName%A_Index%:= Name
DevNames.= id ": " Name "`n"
}
StringTrimRight, DevNames, DevNames, 1
MsgBox % DevNames
#^`::
send, ^s
reload
return
#InstallKeybdHook
#if (WinActive("ahk_class AbletonVstPlugClass") or WinActive("ahk_class Ableton Live Window Class") or WinActive("ahk_class Ableton Live 10 Suite.exe"))
{
alt & esc:: space
^s:: return
; ------------------------------------------------------- selected track control
f3::
note = 0 ; track arm exclusive
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
^f3::
note = 3 ; track arm
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
/::
note = 1 ; track solo exclusive
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
^/::
note = 4 ; track solo
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
#/:: MidiNotePlay(hDev, vChan, 7, 127, 1) ; kill all track solo
.::
note = 2 ; track mute
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
^.::
note = 5 ; track mute exclusive
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
#.::
note = 5 ; kill all track mute
MidiNotePlay(hDev, vChan, 8, 127, 1)
return
[::
note = 84 ; navigate prev/next track
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
^[::
note = 84 ; navigate prev/next track
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
]::
note = 85
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
^]::
note = 85
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
{::
note = 82 ; navigate prev/next scene
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
}::
note = 83
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
lalt & {::
note = 67 ; navigate prev/next device
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
lalt & }::
note = 68
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
lalt & /::
note = 69 ; navigate prev/next device
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
^#!f12::
note = 51 ; auto-select playing clip-slot when selecting a track (toggle, project independent)
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
lalt & m::
note = 12 ; metronome
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
\::
note = 43 ; trigger clip/scene
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
Lshift & Enter::
note = 38
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
`::
note = 49 ; stop all clips
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
lwin & `::
note = 48 ; stop track
MidiNoteOn(hDev, vChan, note, 127)
MidiNoteOff(hDev, vChan, note, 127)
return
^`:: MidiNotePlay(hDev, vChan, 13, 127, 1) ; back to arrangement
pgup:: MidiNotePlay(hDev, vChan, 36, 127, 1) ; fire previous/next scene
pgdn:: MidiNotePlay(hDev, vChan, 40, 127, 1) ;
#pgup:: MidiNotePlay(hDev, vChan, 41, 127, 1) ; fire previous/next clip
#pgdn:: MidiNotePlay(hDev, vChan, 45, 127, 1) ;
f5:: MidiControlChange(hDev, vChan, 22, 113) ; track volume up/down by 3db
f6:: MidiControlChange(hDev, vChan, 22, 15)
#f5:: MidiControlChange(hDev, vChan, 7, 0) ; track volume up/down by 3db
#f6::
MidiControlChange(hDev, vChan, 5, 0)
Loop, 14
{
MidiControlChange(hDev, vChan, 22, 15)
}
MidiControlChange(hDev, vChan, 22, 113)
MidiControlChange(hDev, vChan, 22, 113)
return
; ----------------------------------------------------------- end
mbutton::
Click, 1316 725 ;
Click, 1316 725 ;
return
insert:: Click, 500 88 ; switch to matrix
delete:: Click, 1316 700 ; switch to gear panel
}
#Ifwinactive
;==============================
;==============================
DllCall("winmm\midiOutClose", "Ptr",hMIDIOutputDevice, "UInt")
DllCall("kernel32\FreeLibrary", "Ptr",hModule)
;==================================================
MidiNotePlay(hMIDIOutputDevice, vChannel, vNote, vVelocity, vDuration)
{
MidiNoteOn(hMIDIOutputDevice, vChannel, vNote, vVelocity)
Sleep, % vDuration
MidiNoteOff(hMIDIOutputDevice, vChannel, vNote, 0)
}
MidiNoteOn(hMIDIOutputDevice, vChannel, vNote, vVelocity)
{
DllCall("winmm\midiOutShortMsg", "Ptr",hMIDIOutputDevice, "UInt",0x90 | vChannel | (vNote << 8) | (vVelocity << 16), "UInt")
}
MidiNoteOff(hMIDIOutputDevice, vChannel, vNote, vVelocity)
{
DllCall("winmm\midiOutShortMsg", "Ptr",hMIDIOutputDevice, "UInt",0x80 | vChannel | (vNote << 8) | (vVelocity << 16), "UInt")
}
;==================================================
MidiControlChange(hMIDIOutputDevice, Channel, ControlNo, Value)
{
DllCall("winmm\midiOutShortMsg", "UInt", hMIDIOutputDevice, "UInt", 0xB0 | Channel
| (ControlNo << 8) | (Value << 16)) ;"Control Change" event
}