WORKSPACE - ShortKeys that save your L i v e

Share your Ableton Live secrets here
Post Reply
vereiser
Posts: 3
Joined: Wed Dec 30, 2015 9:53 pm

WORKSPACE - ShortKeys that save your L i v e

Post by vereiser » Thu Jan 31, 2019 12:35 am

I am a big fan of short keys. So I thing, simple standard key combos should be a standard behavior of a programm.
But Ableton Live only offers a hand full. Not even Alt + MenuKey UnderlinedSubMenuKey is working for instance.
One other really big thing live misses is an interface that has free configurable workspaces.
We all want to make music not by clicking buttons and making beats with our mouse clicks.

Ok. No matter.

Here is a small solution for Ableton 9. It's not testet with 10.

The most important advantage here is that you save a lot time cause you need only one hand to have different views of your Ableton Live desktop. Momentary it is a first test. Give it a try. Please :-).
I tried to prepare the code for easy customization.
This version is not the end of the road, but a first step.

I created a short key script for AutoHotkey (.ahk).
The new defined short keys only overwrite specific Ableton Live settings.

A question I have:
Can I create this kind of tool with a tool for Live???

Download .ahk http://www.vereiser.de/Download/Ableton ... utions.ahk
Download .exe (Win7 64 bit only tested at the moment) http://www.vereiser.de/Download/Ableton ... utions.exe

Code: Select all




; +==============================================================================================================+
; | AutoHotKey  für  A B L E T O N  L I V E                                                                      |
; |                                                                                                              |
; | by vereiser                                                                                       07.02.2019 |
; | eismond@vereiser.de                                                                                          |
; |                                                                                                              |
; | F1 - Mixing Area / Mixer-Ansicht                                                                             |
; | F2 - Arrangement View / Arrangement-Ansicht                                                                  |
; | F3 - Mixing Area with Track Details / Mixer-Ansicht mit Spurdetailansicht                                    |
; | F4 - Arrangement View with Clip Details / Arrangement-Ansicht mit Detailansicht                              |
; | F5 - Mixing Area with Track Details and Browser / Mixer-Ansicht mit Spurdetailansicht und Browser            |
; | F6 - Arrangement View with Clip Details and Browser / Arrangement-Ansicht mit Detailansicht und Dateibrowser |
; | F9 - Minimize window / Verstecke Fenster                                                                     |
; | F10 - Maximize window / Vergrö0ere Fenster                                                                   |
; | Win + A (inactiv) - Open Ableton with last used song / öffne Ableton mit letztem Song in Arrangementansicht  |
; | Strg + Tab - Default workspace toggles / Standard-Arbeitsumgebung-Schalter                                   |
; | Strg + Space - Play song in arrangement view / Spiele Song vom Beginn in Arrangementansicht                  |
; | Strg + Esc - Return to last workspace / Zur letzten Workspace zurückkehren                                   |
; | Strg + Alt + Shift + R - Copy track name to clipboard / Namen der Spur in Zwischenablage kopieren            |
; | Alt + Shift + R - Rename track by clipboard / Spur umbenennen über Zwischenablage                            |
; | Strg + NumPad/ - Overview Song / Songübersicht                                                               |
; | Strg + NumPad1 - Ins & Outs / Ein- und Ausgänge                                                              |
; | Strg + NumPad2 - Effect Sends / Effekt-Sends                                                                 |
; | Strg + NumPad3 - Returns Tracks / Return-Spuren                                                              |
; | Strg + NumPad4 - Mixer                                                                                       |
; | Strg + NumPad5 - Delay / Spurverzögerung                                                                     |
; | Strg + NumPad6 - Crossfade                                                                                   |
; | Strg + NumPad7 - Browser                                                                                     |
; | Strg + NumPad8 - Detail View / Detailansicht                                                                 |
; | Strg + NumPad9 - File Manager / Dateiverwaltung                                                              |
; +==============================================================================================================+


Pause Off


; _______________________________________________________________________________________
;   S E T T I N G S
; =======================================================================================

;~ Default settings / Grundeinstellungen
SetTitleMatchMode, 2   ;Der Titel eines Fensters kann den angegebenen Fenstertitel an beliebiger Stelle enthalten, um eine Übereinstimmung zu sein. 
SetTitleMatchMode, slow
SetTitleMatchMode, RegEx

;~ Class for Win 64 - Ableton Live Suite / Klasse für Win 64 - Ableton Live Suite
GroupAdd, LiveWin, ahk_class Afx:0000000140000000:0:0000000000000000:0000000001900015:00000000006B05C3
	
;~ Global vars / Globale Variablen
;~ -- Application title
appAbleton := "Ableton"

;~ Workspaces for tab key
defaultSpace1 := 1
defaultSpace2 := 2

;~ -- Default
fullScreen := false
checkPositions := false
lastWorkspaceId := ""
actualWorkspaceId := ""
defaultWorkspaceToggleId := defaultSpace1


; ____________________________________________________________________________________________________
;   M I X E R - D E T A I L S :  Different Panels / Verschiedene Panele
; ====================================================================================================

;~ Overview / Übersicht
LControl & NumpadDiv::

	If WinActive(appAbleton) {
		Send ^!o
		callEscape()
	}

	return


;~ In and Out / Ein- und Ausgänge
LControl & Numpad1::

	If WinActive(appAbleton) {
		Send ^!i
		callEscape()
	}

	return


;~ Sends / Effekt-Sends
LControl & Numpad2::

	If WinActive(appAbleton) {
		Send ^!s
		callEscape()
	}

	return


;~ Returns / Return-Spuren
LControl & Numpad3::

	If WinActive(appAbleton) {
		Send ^!r
		callEscape()
	}

	return


;~ Mixer / Mixer
LControl & Numpad4::

	If WinActive(appAbleton) {
		showMixerSection()
		callEscape()
	}

	return


;~ Delay / Spurverzögerung
LControl & Numpad5::

	If WinActive(appAbleton) {
		Send !A {Up} {Up} {Up} {Up} {Enter}
		callEscape()
	}

	return


;~ Crossfade / Überblendung
LControl & Numpad6::

	If WinActive(appAbleton) {
		showMixerCrossFade()
		callEscape()
	}

	return


;~ Browser / Browser
LControl & Numpad7::

	If WinActive(appAbleton) {
		showBrowser()
		callEscape()
	}

	return


;~ Detail view / Detailansicht
LControl & Numpad8::

	If WinActive(appAbleton) {
		showDetailView()
		callEscape()
	}

	return


;~ File Manager / Dateiverwaltung
LControl & Numpad9::

	If WinActive(appAbleton) {
		showFileManager()
		callEscape()
	}

	return


;~ Kopieren des Tracknamens vollständig
!^+r::

	If WinActive(appAbleton) {
		Send, ^r
		sleep 1
		Send, ^c
		
	}
	return
	

;~ Umbenennen mit Zwischenablage
!+r::

	If WinActive(appAbleton) {
		Send, ^r
		Sleep 1
		Send ^v
	}
	return
	

;~ Tabulator-Taste für zwei Standard Workspaces
LControl & Tab::

    If WinActive(appAbleton) {
	    if (defaultWorkspaceToggleId = defaultSpace1) {
		    defaultWorkspaceToggleId := defaultSpace2
		
			showWorkspace(defaultSpace2)
		}
		else {
			defaultWorkspaceToggleId := defaultSpace1
	
	    	showWorkspace(defaultSpace1)
		}
	}
	
	return



;~ Zum Start des Songs springen und abspielen
;~ LControl & Space::

	;~ If WinActive(appAbleton) {
		;~ Send NumpadMult
		;~ Send NumpadMult
		;~ Sleep 1000
		;~ Send Space
	;~ }
	
	;~ return
	

;~ Zum letzen Fenster zurückspringen
LControl & Esc::

	If WinActive(appAbleton) {
		showWorkspace(lastWorkspaceId)
	}
	
	return	
	
	
;~ Ableton aufrufen mit letztem Song
;~ LWin & A:: 

	;~ buttonPositions := getButtonPositions()

	;~ WinMinimizeAll

	;~ Run "C:\Program Files (x86)\Ableton Live\Program\Ableton Live 9 Suite.exe"
	
	; ;~ Wait while loading
	;~ while (!WinActive(appAbleton)) { 
	;~ } 
	
	
	;~ hideAllMenues()
	;~ showTypeArrangement(buttonPositions)
	
	
	;~ openLastSong()
	
	;~ return


; ____________________________________________________________________________________________________
;   W O R K S P A C E  A  :  Arrangement View / Arrangement-Ansicht
; ====================================================================================================

F1::

	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeArrangement(buttonPositions)
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 1
	}

	return


; ____________________________________________________________________________________________________
;   W O R K S P A C E  B  :  Mixing View / Mixer-Ansicht
; ====================================================================================================

F2::
	
	If WinActive(appAbleton) { 
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeMixer(buttonPositions)
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 2
	} 

	return


; ____________________________________________________________________________________________________
;   W O R K S P A C E  C  :  Arrangement View with Detail View / Arrangement-Ansicht mit Detailansicht
; ====================================================================================================

F3::

	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeArrangement(buttonPositions)
	
		showDetailsArrangement(buttonPositions) 
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 3
	}

	return


; ____________________________________________________________________________________________________
;   W O R K S P A C E  D  :  Mixing View with Details /  Mixer-Ansicht mit Detailansicht
; ====================================================================================================

F4::

	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeMixer(buttonPositions)
		
		showDetailsMixer(buttonPositions) 
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 4
	}

	return
	
	
;_____________________________________________________________________________________________________
;   W O R K S P A C E  E :  Arrangement View with Detail View / Arrangement-Ansicht mit Detailansicht und Browser
; ====================================================================================================

F5::

	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeArrangement(buttonPositions)
		
		showBrowser()
		
		showDetailsMixer(buttonPositions) 
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 5
	}

	return
	

; ____________________________________________________________________________________________________
;   W O R K S P A C E  F :  Mixing View with Details and Browser / Mixer-Ansicht mit Detailansicht und Browser
; ====================================================================================================

F6::

	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeMixer(buttonPositions)
		
		showBrowser()
		
		showDetailsMixer(buttonPositions) 
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 6
	}

	return
	
	
; ____________________________________________________________________________________________________
;   M I N I M I Z E
; ====================================================================================================

F9::

	If WinActive(appAbleton) {
		WinMinimize
	}

	return	
	
	
; ____________________________________________________________________________________________________
;   M A X I M I Z E
; ====================================================================================================

F10::

	If WinActive(appAbleton) {
		WinMaximize
	}

	return
	
	
;_____________________________________________________________________________________________________
;    D E V E L O P E R  -  T E S T S
; ====================================================================================================

;~ F12::
	;~ Suspend

	;~ ;~ If WinActive("ahk_group LiveWin") {
	;~ If WinActive(appAbleton) {
		;~ data := getButtonPositions()
		
		;~ Test
		;~ MouseMove data.xMenuDetailsMixer, data.yMenuDetails, 1
		;~ Sleep 1000
		
		;~ MouseMove data.xMenuDetailsArrangement, data.yMenuDetails, 1
		;~ Sleep 1000
		
		;~ MouseMove data.xMenuType, data.yButtonTypeMixer, 1 
		;~ Sleep 1000
		
		;~ MouseMove data.xMenuType, data.yButtonTypeArrangement, 1 
		;~ Sleep 1000
	;~ }

	;~ return


; ____________________________________________________________________________________________________
;   F U N C T I O N S
; ====================================================================================================

showWorkspace(workspaceId) {
	if (workspaceId = 1) {
		Send, {F1}
	}
	
	if (workspaceId = 2) {
		Send, {F2}
	}
	
	if (workspaceId = 3) {
		Send, {F3}
	}
	
	if (workspaceId = 4) {
		Send, {F4}
	}
	
	if (workspaceId = 5) {
		Send, {F5}
	}
	
	if (workspaceId = 6) {
		Send, {F6}
	}
}

showMixerCrossFade() {
	Send !A {Up} {Up} {Up} {Enter}
}

showDetailsArrangement(buttonPositions) {
	clickPosition(buttonPositions.xMenuDetailsArrangement, buttonPositions.yMenuDetails, checkPositions)
	sleep 1
}

showDetailsMixer(buttonPositions) {
	clickPosition(buttonPositions.xMenuDetailsMixer, buttonPositions.yMenuDetails, checkPositions)
	sleep 1
}

showTypeArrangement(buttonPositions) {
	clickPosition(buttonPositions.xType, buttonPositions.yTypeArrangement)
	sleep 1
}

showTypeMixer(buttonPositions) {
	clickPosition(buttonPositions.xType, buttonPositions.yTypeMixer, checkPositions)
	sleep 1
}

showDetailView() {
	Send ^!l
	sleep 1
}

showBrowser() {
	Send ^!b
	sleep 100
}

showMixerSection() {
	Send !A {Up} {Up} {Up} {Up} {Up} {Enter}
	sleep 1
}

showFileManager() {
	Send !A {Down} {Down} {Down} {Down} {Enter}
	sleep 1
}

openLastSong() {
	;~ Send !d {Down} {Down} {Right} {Enter}
	Send !d {Down} {Down} {Right} {Enter}
}

callEscape() {
	Send {Escape}
	sleep 1
}

clickPosition(x,y, check = false) {
	MouseGetPos, mausX, mausY
	
	if (check) {
		MouseMove, x, y
		Sleep 3000
	}
	
	MouseClick, left, x, y, 1, 1
	MouseMove, mausX, mausY, 0
	
	Sleep 1
}

getWindowSettings() {
	WinGetPos , x, y, width, height
	
	return {x: x, y: y, width: width, height: height}
}

getScreenResolution() {
	SysGet, Monitor, Monitor, %A_Index%
	SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
	
	return {x: MonitorRight, y:MonitorBottom, workAreaX: MonitorWorkAreaRight, workAreaY: MonitorWorkAreaBottom}
}

hideAllMenues() {
	;~ Hide Browser View / Browser aus
	Send ^!g   ; GroovePool
	showBrowser() 
	
	;~ Hide Right Menu / Rechtes Menü aus
	Send !A {Down} {Down} {Down} {Enter}
	showFileManager()
	showFileManager()
	
	;~ Hide Detail Menu / Unteres Menü aus
	Send, {LShift}+{Tab}
	showDetailView()
}

getButtonPositions() {
	windowSettings   := getWindowSettings()
	screenResolution := getScreenResolution()
	
	yMixer            = 117
	yArrangement      = 95
	xMixerDetails     = 60
	xMixerArrangement = 160
	
	;~ Default
	xWindowRight            := windowSettings.width
	yWindowTop              := 0
	yWindowBottom           := windowSettings.height
	
	;~ View Type
	xMenuType               := xWindowRight - 25
	yButtonTypeMixer        := yWindowTop + yMixer
	yButtonTypeArrangement  := yWindowTop + yArrangement
	
	;~ Details
	yMenuDetails            := yWindowBottom - 25
	xMenuDetailsMixer       := xWindowRight - xMixerDetails
	xMenuDetailsArrangement := xWindowRight - xMixerArrangement
	
	return { yMenuDetails: yMenuDetails, xMenuDetailsMixer: xMenuDetailsMixer, xMenuDetailsArrangement: xMenuDetailsArrangement, xType: xMenuType, yTypeMixer: yButtonTypeMixer, yTypeArrangement: yButtonTypeArrangement }
}

Feel free making me proposals.

vereiser
Posts: 3
Joined: Wed Dec 30, 2015 9:53 pm

Re: WORKSPACE - ShortKeys that save your L i v e

Post by vereiser » Thu Feb 07, 2019 8:46 pm

Update

flipotto
Posts: 141
Joined: Mon Oct 23, 2006 4:28 pm
Location: Virginia

Re: WORKSPACE - ShortKeys that save your L i v e

Post by flipotto » Sun Jun 16, 2019 2:44 pm

Nice work!

I have been working on a few things with ahk as well.
Adding plugins

Code: Select all

/*
	This method taken from ; Author: Nathan McCallum (1vasari)
	I have used different keys to use ` + key to trigger insert plugin
*/ 

` & c::AddPlugin("Compressor")
` & d::AddPlugin("DrumRack_StudioDrummer Garage") ; custom for me 	
` & e::AddPlugin("EQ Eight")

AddPlugin(plugin_name)  { 			; function called by hotkeys above to insert plugin
	;msgbox, ,,plugin add 			; only for testing
	Send, ^f
	Send, %plugin_name%
	Sleep, 300 ;					; Sleep while the search query completes
	Send, {Down}{Enter}			; move down then hit enter
	;sleep,  300					; sleep 300 - may not need this
	Send, {up}{Del}{down}{left}{up 3}	; cursor up,  delete search,  move down left up 3
	;~ sleep,  300
	;~ send,  ^!b 					; closes the browser - I like browser open
	return
}
Scrolling through vst presets for vst's with arrow keys.
Two methods.
The first works with all plugins, settitlematchmode, 2 and CoordMode, Mouse, Relative - required.

Code: Select all

; =============== Arturia many of their plugins use the same coordinates ; =============== 
/*  
	This method will move the mouse to location then click
	ALL Artuia windows need to be at 90% ZOOM - you are welcome to change that, however it will change the x,y 	 
        coordinates
*/

#IfWinActive Mini V3 ;
LEFT:: send {click, 730, 60}      ; back patch x=730, y = 60
right::send {click, 780, 60}      ; forward patch
#IfWinActive 

#IfWinActive CS-80 V3 ;
LEFT:: send {click, 730, 60}      ; back patch
right::send {click, 780, 60}      ; forward patch
#IfWinActive 

The second method uses controlclick, the mouse does not actually move to the location.
This works for many, but not all plugins with buttons to change presets.
Does NOT work with any Arturia plugins.

Code: Select all

#IfWinActive Kontakt ;
Left:: patchChange(648, 120)		; calls patchChange function below passing x, y coordinates of patch change buttons
Right::patchChange(665, 120)
#IfWinActive

#IfWinActive Massive
Left:: patchChange(610, 75)
Right::patchChange(610, 55)
#IfWinActive

#IfWinActive FM8
Left:: patchChange(438, 70)
Right::patchChange(438, 85)
#IfWinActive

patchChange(x, y) {   ; Function pickup vst name and coordinats of patch buttons

	SetControlDelay, -1
	ControlClick, x%x% y%y%,,,left,1, NA  	; Sends a click to the button at coordinates
	return
}


Post Reply