WORKSPACE - ShortKeys that save your L i v e

Share your favorite Ableton Live tips, tricks, and techniques.
Post Reply
vereiser
Posts: 19
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 think 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 I present a small solution for Ableton 9. It's not testet with 10.

The most important advantage of my tool is that you save a lot of time, cause you need only one shortkey to show another view of your Ableton Live desktop - at least 6 worksspaces. Additionally you can hide / show mixer controls or ableton panels with easy keyboard shortcuts.

Momentary it is a first test. Give it a try. Please :-).
I tried to prepare the code for easy customization.

I created the short key script with AutoHotkey (file extension .ahk).
The new defined short keys overwrite Ableton Live ones only.

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  -  A B L E T O N  L I V E                                                                        |
; |                                                                                                              |
; | by vereiser                                                                                       16.11.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                  |
; | Tab - 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 + NumPad0 - Effect Sends / Effekt-Sends                                                                 |
; | Strg + NumPad1 - Ins & Outs / Ein- und Ausgänge                                                              |
; | Strg + NumPad2 - Mixer                                                                                       |
; | Strg + NumPad3 - Returns Tracks / Return-Spuren                                                              |
; | Strg + NumPad4 - Delay / Spurverzögerung                                                                     |
; | Strg + NumPad5 - S P E C I A L                                                                               |
; | Strg + NumPad6 - Crossfade                                                                                   |
; | Strg + NumPad7 - Browser                                                                                     |
; | Strg + NumPad8 - Detail View / Detailansicht                                                                 |
; | Strg + NumPad9 - File Manager / Dateiverwaltung                                                              |
; | Strg + NumPad/ - Overview Song / Songübersicht                                                               |
; +==============================================================================================================+


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
global appAbleton := "Ableton"

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

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






; ____________________________________________________________________________________________________
;   K E Y M A P P I N G
; ====================================================================================================

LControl & NumpadDiv::  keyOverview()                                       return 
LControl & Numpad1::    keyInAndOuts()                                      return
LControl & Numpad2::    keySends()                                          return
LControl & Numpad3::    keyReturns()                                        return
LControl & Numpad4::    keyMixer()                                          return
LControl & Numpad5::    keyTrackDelay()                                     return
LControl & Numpad6::    keyCrossfade()                                      return
LControl & Numpad7::    keyBrowser()                                        return
LControl & Numpad8::    keyDetailView()                                     return
LControl & Numpad9::    keyFileManager()                                    return
!^+r::                  keyCopyName()                                       return
!+r::                   keyRename()                                         return
LControl & Tab::        keyToggleWorkspaces()                               return
LControl & Space::      keyJumpToStart()                                    return
LControl & Esc::        keyLastWorkspace()                                  return	
LWin & A::              keyOpenAbletonWithLastSongOpened()                  return
F1::                    keyWorkspaceArrangementView()                       return
F2::                    keyWorkspaceMixingView()                            return
F3::                    keyWorkspaceArrangementViewWithDetails()            return
F4::                    keyWorkspaceMixingViewWithDetails()                 return
F5::                    keyWorkspaceArrangementViewWithDetailsAndBrowser()  return
F6::                    keyWorkspaceMixingViewWithDetailsAndBrowser()       return
F9::                    keyMinimize()                                       return	
F10::                   keyMaximize()                                       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
; ====================================================================================================

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


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 }
}


;~ K E Y  A C T I O N S

 ;~ Overview / Übersicht
keyOverview() {
	If WinActive(appAbleton) {
		Send ^!o
		callEscape()
	}
}

;~ In and Out / Ein- und Ausgänge
keyInAndOuts() {
	If WinActive(appAbleton) {
		Send ^!i
		callEscape()
	}
}

;~ Sends / Effekt-Sends
keySends() {
	If WinActive(appAbleton) {
		Send ^!s
		callEscape()
	}
}

;~ Returns / Return-Spuren
keyReturns() {
	If WinActive(appAbleton) {
		Send ^!r
		callEscape()
	}
}

;~ Mixer / Mixer
keyMixer() {
	If WinActive(appAbleton) {
		showMixerSection()
		callEscape()
	}
}

;~ Delay / Spurverzögerung
keyTrackDelay() {
	If WinActive(appAbleton) {
		Send !A {Up} {Up} {Up} {Up} {Enter}
		callEscape()
	}
}

;~ Crossfade / Überblendung
keyCrossfade() {
	If WinActive(appAbleton) {
		showMixerCrossFade()
		callEscape()
	}
}

;~ Browser / Browser
keyBrowser() {
	If WinActive(appAbleton) {
		showBrowser()
		callEscape()
	}
}

;~ Detail view / Detailansicht
keyDetailView() {
	If WinActive(appAbleton) {
		showDetailView()
		callEscape()
	}
}

;~ File Manager / Dateiverwaltung
keyFileManager() {
	If WinActive(appAbleton) {
		showFileManager()
		callEscape()
	}
}

;~ Copy of a name / Kopieren eines Namens
keyCopyName() {
	If WinActive(appAbleton) {
		Send, ^r
		sleep 1
		Send, ^c
	}
}

;~ Rename / Umbenennen mit Zwischenablage
keyRename() {
	If WinActive(appAbleton) {
		Send, ^r
		Sleep 1
		Send ^v
	}
}

;~ Tabulator-Taste für zwei Standard Workspaces
keyToggleWorkspaces() {
    If WinActive(appAbleton) {
	    if (defaultWorkspaceToggleId = defaultSpace1) {
		    defaultWorkspaceToggleId := defaultSpace2
		
			showWorkspace(defaultSpace2)
		}
		else {
			defaultWorkspaceToggleId := defaultSpace1
	
	    	showWorkspace(defaultSpace1)
		}
	}
}

;~ Zum Start des Songs springen und abspielen
keyJumpToStart() {
	If WinActive(appAbleton) {
		Send NumpadMult
		Send NumpadMult
		Sleep 1000
		Send Space
	}
}

;~ Zum letzen Fenster zurückspringen
keyLastWorkspace() {
	If WinActive(appAbleton) {
		showWorkspace(lastWorkspaceId)
	}
}

;~ Ableton aufrufen mit letztem Song
keyOpenAbletonWithLastSongOpened() {
	buttonPositions := getButtonPositions()

	WinMinimizeAll

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

;~ W O R K S P A C E  A  :  Arrangement View / Arrangement-Ansicht
keyWorkspaceArrangementView() {
	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeArrangement(buttonPositions)
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 1
	}
}

;~ W O R K S P A C E  B  :  Mixing View / Mixer-Ansicht
keyWorkspaceMixingView() {
	If WinActive(appAbleton) { 
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeMixer(buttonPositions)
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 2
	} 
}

;~ W O R K S P A C E  C  :  Arrangement View with Detail View / Arrangement-Ansicht mit Detailansicht
keyWorkspaceArrangementViewWithDetails() {
	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeArrangement(buttonPositions)
	
		showDetailsArrangement(buttonPositions) 
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 3
	}
}

;~ W O R K S P A C E  D  :  Mixing View with Details /  Mixer-Ansicht mit Detailansicht
keyWorkspaceMixingViewWithDetails() {
	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeMixer(buttonPositions)
		
		showDetailsMixer(buttonPositions) 
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 4
	}
}

;~ W O R K S P A C E  E :  Arrangement View with Detail View and Browser / Arrangement-Ansicht mit Detailansicht und Browser
keyWorkspaceArrangementViewWithDetailsAndBrowser() {
	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeArrangement(buttonPositions)
		
		showBrowser()
		
		showDetailsMixer(buttonPositions) 
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 5
	}
}

;~ W O R K S P A C E  F :  Mixing View with Details and Browser / Mixer-Ansicht mit Detailansicht und Browser
keyWorkspaceMixingViewWithDetailsAndBrowser() {
	If WinActive(appAbleton) {
		buttonPositions := getButtonPositions()
		
		hideAllMenues()
		
		showTypeMixer(buttonPositions)
		
		showBrowser()
		
		showDetailsMixer(buttonPositions) 
		
		lastWorkspaceId   := actualWorkspaceId
		actualWorkspaceId := 6
	}
}

;~ Minimize
keyMinimize() {
	If WinActive(appAbleton) {
		WinMinimize
	}
}

;~ Maximize
keyMaximize() {
	If WinActive(appAbleton) {
		WinMaximize
	}
}
Feel free making me proposals.
Last edited by vereiser on Tue Nov 26, 2019 8:30 am, edited 10 times in total.

vereiser
Posts: 19
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: 143
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
}


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

Some changes

Post by vereiser » Sat Nov 16, 2019 10:04 am

I've been working on keymapping for the Autohotkey script while puting all the code under the key commands in functions to make it possible remapping keys easier. If you have wishes for implementations, I will try to implement it into the script. Thanx

You find the new version on the top of this post.

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

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

Post by vereiser » Sat Nov 16, 2019 2:53 pm

flipotto wrote:
Sun Jun 16, 2019 2:44 pm
Nice work!

I have been working on a few things with ahk as well.
Adding plugins
Thanx for the code sniplet. I implement it in my code. Very fine solution of using Autohotkey with Ableton.

jonljacobi
Posts: 914
Joined: Sat Dec 30, 2017 3:36 am

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

Post by jonljacobi » Thu Nov 21, 2019 9:07 pm

My simple key remapping for those that just want single key access to the existing functions. Thought it might save people a little time learning how it works. This won't affect other programs because of the #IfWinActive statement.

https://www.autohotkey.com/docs/KeyList.htm for other keys. Just add, edit, replace to taste.

Code: Select all

#IfWinActive ahk_class Ableton Live Window Class

;! equals Alt, ^ equals Ctrl, + equals shift

l::^l

numpad1::^!b
numpad2::^!l
numpad3::^!g
numpad4::^!i
numpad5::^!m
numpad6::^!r
numpad7::^!o
numpad8::+tab
numpad9::?
numpaddot::^l
numpadenter::F9

F16::m
;m is mapped via ableton to the metronome.
F17::^+f

Post Reply