Co to Melodics?

Od tego zaczne, bo to specyficzny wpis na tym blogu + target to społeczność tej aplikacji stąd też angielska wersja wpisu.

W skrócie to aplikacja do nauki gry na keyboardzie MIDI, padach lub perkusji eletkronicznej. Takie trochę “guitar hero” nastawione na naukę.

Więcej informacji na stronie producenta - https://melodics.com/.

Dlaczego dodatkowy kontroler?

Ponieważ nienawidzę obracać się i przeklikiwać przez opcje na PC.

Melodics oferuje tylko jeden skrót dostępny z perkusji i służy on tylko jako “repeat”/”play”, a to zdecydowanie za mało. Są też dostępne skróty z klawiatury - https://melodics.com/support-articles/support-keyboard-shortcuts.

Tak wygląda mój setup (tak - w szafie :/ bo sąsiadce z dołu się trochę nie podobało):

Widać tam “DNA EasyPad” - kontroler MIDI zamontowany na ściance - to jest mój kontroler do Melodics.

Generalnie pierwszy pomysł to było zbudowanie czegoś takiego samemu - ale bardziej uniwersalnym rozwiązaniem jest wykorzystanie gotowego hardware.

Teraz mam dostęp do wielu opcji używając pałek perkusyjnych.

Jak?

W tle działa dodatkowa aplikacja, która konwertuje otrzymane sygnały MIDI na:

  • wciśnięcia przycisków
  • kliknięcia myszy w określonych pozycjach
  • “skrypty” - czyli wielokrotne kliknięcia w różnych pozycjach

Co mogę tym zrobić?

Aktualnie mogę symulować kliknięcia:

  • “spacji” - do wejścia w piosenkę/restart
  • “esc” - do wyjścia
  • w przycisk “retry” po utworze
  • w przycisk “exit” po utworze
  • w przycisk “play lesson” na ekranie “kursów”
  • strzałek do poruszania się po menu
  • skrypt kliknięć do wejścia w “practice mode” z określoną ilością gwiazdek
  • w przycisk “performace mode”
  • zwiększać/zmniejszać bpm

I bez problemu można dodawać kolejne opcje

Instrukcja

Podstawowa instalacja i mapowanie przycisków

Pobierze i zainstaluj aplikację AHK (AutoHotKey) - https://www.autohotkey.com/ - to ona jest wykorzystywana do konwersji MIDI na klawisze itp.

Pobierz skrypty do AHK: https://gitlab.com/embedownik/melodicscontroller. Nie jest to moje dzieło od zera, jest bazowane na “ogólnym” skrypcie konwertera do MIDI - strona autora: https://github.com/genmce/AHK_Midi2Keypress

Musimy sprawdzić, czy nasze urządzenie jest poprawnie wykrywane + utworzyć listę “identyfikatorów” przycisków.

Podłącz urządzenie do PC.

Uruchom w AHK plik “Midi2Keypress_1.0.ahk”. W przypadku pierwszego uruchomienia należy wybrać urządzenie które ma być kontrolerem.

Wybierz urządzenie z listy + kliknij “Done - Reload” - w moim przypadku jest to “W-PAD”.

Po restarcie zobaczymy okno “MidiMonitor” - teraz można kliknąć na pady i zobaczyć, czy są wykrywane:

Teraz należy spisać numery przypisane do konkretnych padów/przycisków - jest to pole “data1”.

Ważna kwestia - są 2 typy przycisków/eventów - “NoteOn” i “CC” (kontrolne). Informacje o tym też spisujemy.

Maping dla mojego urządzenia:

Utworzenie danych dla Melodics

Informacje o akcjach po sygnale MIDI znajdują się w pliku “userKeysActions.ahk” - nie należy modyfikować pozostałych plików - dlatego zostało to wydzielone.

Pliki ahk można edytować w notatniku/notepad++ itp.

Najpierw zacznijmy od podstawowego testu - demonstracja jak dodać reakcję na pojedyncze kliknięcie. Wklej poniższy text do pliku “userKeysActions.ahk” zastępując domyślną zawartość i zrestartuj aplikację “Midi2Keypress_1.0.ahk”:

; "wrapper" - simple logic to get only "pressed" events
; and separate to Pads/Control buttons
userKeysActions(stb, data1, data2)
{
	if(stb = "NoteOn" and data2 != "0")
	{
		MsgBox % "TEST - button numer " . data1 . " clicked!"
	}
}

Oczekiwany wynik testu:

Okienko z wiadomością o wciśniętym przycisku

Test + symulacja kliknięcia

Teraz zamień kolejny raz treść “userKeysActions.ahk”:

; buttons IDs:
testSpacePadId := 39

; "wrapper" - simple logic to get only "pressed" events
; and separate to Pads/Control buttons
userKeysActions(stb, data1, data2)
{
	/*
		Availaible variables:
		stb   -> "NoteOn"/"NoteOff"/"PC"
		data1 -> button indicator
		data2 -> in case of Note - "VELEOCITY"
		         in case of CC   - 127 means pressed
				                     0 means released
	*/	
	
	; only when melodics is started
	#If WinActive("ahk_exe Melodics.exe")
	{
		if(stb = "NoteOn" and data2 != "0")
		{
			clickPads(data1)
		}
	}
}

clickPads(button)
{
	global testSpacePadId
	
	switch button
	{
		case testSpacePadId:
		{
			send, {space}
			return
		}
	}
}

To jest “ready to use” skrypt z tylko jedną opcją - symulowaniem wciśnięcia spacji. Należy zmienić numer “39” na twój numer pada do testów. Pozostała część pliku to “formatka”, aby wydzielić rzeczy do modyfikacji i uprościć to.

Linijka “send, {space}” to nasza akcja do wykonania.

Więc dla dodania kolejnych akcji potrzebna jest tylko prosta modyfikacja w taki sposób:

; buttons IDs:
testSpacePadId := 39
testEscPadId   := 40

; "wrapper" - simple logic to get only "pressed" events
; and separate to Pads/Control buttons
userKeysActions(stb, data1, data2)
{
	/*
		Availaible variables:
		stb   -> "NoteOn"/"NoteOff"/"PC"
		data1 -> button indicator
		data2 -> in case of Note - "VELEOCITY"
		         in case of CC   - 127 means pressed
				                     0 means released
	*/
	
	; only when melodics is started
	#If WinActive("ahk_exe Melodics.exe")
	{
		if(stb = "NoteOn" and data2 != "0")
		{
			clickPads(data1)
		}
	}
}

clickPads(button)
{
    global testSpacePadId, testEscPadId

	switch button
	{
		case testSpacePadId:
		{
			send, {space}
			return
		}
		case testEscPadId:
		{
			send, {Esc}
			return
		}
	}
}

Wydaje się proste.

Symulowanie kliknięć myszy

W przypadku kliknięć myszą należy wskazać konkretną pozycję na ekranie w pikselach.

W AHK istnieje dodatkowa aplikacja “Window Spy”, aby zdobyć tego typu informacje.

Aby otworzyć “Window Spy” - kliknij prawym klawiszem myszy na ikonkę “AHK” w trayu i wybierz “Window Spy”:

Teraz otwórz Melodics i sprawdź pozycję przycisku - w tym przypadku “playground mode”:

Spisz dane z pozycji “MousePosition”.

Przykładowa zawartość pliku “userKeysActions.ahk” z pojedynczym kliknięciem:

; buttons IDs:
testClickPadId := 39

; "wrapper" - simple logic to get only "pressed" events
; and separate to Pads/Control buttons
userKeysActions(stb, data1, data2)
{
	/*
		Availaible variables:
		stb   -> "NoteOn"/"NoteOff"/"PC"
		data1 -> button indicator
		data2 -> in case of Note - "VELEOCITY"
		         in case of CC   - 127 means pressed
				                     0 means released
	*/
	
	; only when melodics is started
	#If WinActive("ahk_exe Melodics.exe")
	{
		if(stb = "NoteOn" and data2 != "0")
		{
			clickPads(data1)
		}
	}
}

clickPads(button)
{
	global testClickPadId
	
	switch button
	{
		case testClickPadId:
		{
			Click, 1710 117
			return
		}
	}
}

Symulacja wielu kliknięć

Sprawdź pozycję dla kilku przycisków, dodaj je do skryptu z dodatkowym oczekiwaniem jako “delay”. Dla przykładu kilkukrotne kliknięcie w ten sam przycisk to:

clickPads(button)
{
	switch button
	{
		case testClickPadId:
		{
			Click, 1710 117
			sleep, 1000
			Click, 1710 117
			sleep, 1000
			Click, 1710 117
			sleep, 1000
			Click, 1710 117
			sleep, 1000
			return
		}
	}
}

Liczba po “sleep” to czas oczekiwania w milisekundach - jest to wymagane aby Melodics miał czas na dokonczenie akcji.

Przyciski kontrolne

W przypadku akcji na kliknięcie przycisków “CC” jest mała różnica - zamiast funkcji “clickPads” a pliku ahk używamy funkcji “clickControl” - czyli w innym miejscu wpisujemy co ma się wydarzyć. Sprawdź jak wygląda mój plik jako przykład.

Podsumowanie

To jest mój sposób na “ułatwienie” i zdecydowanie usprawdnienie pracy/nauki z Melodics.

Prosty filmik jak melodics reaguje na moje komendy z padów: https://youtu.be/Xiy68o9aUl4.

Niestety - nie wiem jak używać tego samego urządzenia jednocześnie do komend i do gry w Melodics.

Podpowiedź - w moim przypadku 12 padów (2x6) wystarczyło na podstawowe funkcjonalności. Coś co można dodać - sterowanie taktami w “set loop” - w planach mam przejścia na coś z 20padami w przyszłości.