Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LaunchPad X support #16

Open
jpetazzo opened this issue Nov 23, 2020 · 11 comments
Open

LaunchPad X support #16

jpetazzo opened this issue Nov 23, 2020 · 11 comments

Comments

@jpetazzo
Copy link
Owner

Originally posted by @worikgh in #8 (comment)

The LaunchPad X is not supported at the moment. There is a good chance that the MIDI messages are very similar and that we can get at least basic features just by adding it to the detection code. If you have a LaunchPad X and some Python skills, I'll be happy to walk you through the process!

@jpetazzo
Copy link
Owner Author

jpetazzo commented Nov 23, 2020

Some details ...

The code detects the type of LaunchPad by looking at the MIDI port name.
Depending on the name of the port, it uses a different adapter class (because the exact MIDI messages change a bit between different models of LaunchPad).

The detection is done here:
https://github.com/jpetazzo/griode/blob/master/griode.py#L54

It should be relatively easy to add support for the LaunchPad X (assuming that the MIDI messages are not too different).

@worikgh
Copy link

worikgh commented Nov 24, 2020

I have a Launchpad X, very little Python but lots of programming experience.

Just running grode and there is a port_name (in detected_ports) of Launchpad X:Launchpad X MIDI 2 24:1 and Launchpad X:Launchpad X MIDI 1 24:0

Added a class in launchpad.py by copying LaunchpadMK2 called LaunchpadX and edited griod.py until it ran.

The pad lights up and when I press a button that is not lit I get: [WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=49 velocity=0 time=0. If I press on green, blue or pink button I get nothing on the console.

No sound yet

@worikgh
Copy link

worikgh commented Nov 24, 2020

Running as: GRIODE_AUDIO_DRIVER=jack ./griode.py got. No sound yet.

/home/patch/griode/palette.py:51: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(open("palette.yaml"))
[WARNING] fluidsynth.py:52 __init__() -> Fluidsynth starting
[WARNING] fluidsynth.py:56 __init__() -> Fluidsynth detect audio jack
[INFO] fluidsynth.py:78 __init__() -> Using audio driver: jack
fluidsynth: Jack sample rate mismatch, adjusting. (synth.sample-rate=44100, jackd=96000)
[INFO] fluidsynth.py:109 __init__() -> Found 269 instruments
fluidsynth: Jack sample rate mismatch, adjusting. (synth.sample-rate=44100, jackd=96000)
[INFO] fluidsynth.py:138 __init__() -> Connected to MIDI output griode:griode 137:0
[INFO] griode.py:159 program_change() -> Channel 0 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 1 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 2 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 3 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 4 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 5 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 6 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 7 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 8 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 9 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 10 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 11 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 12 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 13 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 14 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 15 switching to instrument B0 P0: Stereo Grand
[INFO] launchpad.py:11 __init__() -> Opening grid device Launchpad X:Launchpad X MIDI 1 24:0
[INFO] launchpad.py:11 __init__() -> Opening grid device Launchpad X:Launchpad X MIDI 2 24:1
[WARNING] clock.py:61 poll() -> We're running late by -0.4600107669830322 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=60 velocity=4 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=60 velocity=0 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=60 velocity=23 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=60 velocity=0 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=59 velocity=18 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=59 velocity=0 time=0

@jpetazzo
Copy link
Owner Author

Hi! You're definitely on the right track 👍

I downloaded the LaunchPad X programmer manual and compared it to the LaunchPad Pro programmer manual. Good news: the "programmer layout" of the LaunchPad X seems to be exactly the same note# and CC# than on the Pro!

However, the fact that you mention green/blue/pink means that the LaunchPad is probably still in its default layout (the "Note" layout), as opposed to the "Programmer layout" used by Griode on the LP Pro. Normally, when Griode starts, it sends a special MIDI sequence (a SysEx) to the LP Pro to switch modes automatically; then it "refreshes" the display, and at that point, the LaunchPad should show the default initial layout, which should be a C scale where C is in red, DEFGAB are in white, and the flats and sharps are in black. (This should all happen almost immediately when starting Griode.)

Here is what I would try.

  1. Change the code (as you did) but use the LP Pro class instead of the Mk2 class. (The Mk2 has slightly different MIDI messages for the top- and right- rows of pads.)

  2. Try switching to Programmer Mode using the LaunchPad's "setup" menu. (I'm not familiar with the LaunchPad X so I don't know exactly how that works; so if that doesn't make sense to you, let me know, and I'll check in the user manual :))

  3. Then, start Griode. If you're lucky, the LaunchPad will flash and show the C scale with C in red.

If that works, then I would add code in Griode to automatically send the SysEx to switch modes. That part should be relatively easy because there is already that behavior for the LP Pro, and the sequences are well documented in Novation's programmers manuals, so I would be able to help if needed.

@worikgh
Copy link

worikgh commented Nov 24, 2020

Fantastic. It will be a few days before I get a chance to look closely at this again.

But in the meantime may I ask...

I see:
[INFO] fluidsynth.py:78 __init__() -> Using audio driver: jack

in the log from FluidSynth but not....

        # Invoke fluidsynth a first time to enumerate instruments
        logging.debug("Invoking fluidsynth to enumerate instruments...")

All there is between the two logging messages is:

        popen_args = [
            "fluidsynth", "-a", audio_driver,
            "-o", "synth.midi-bank-select=mma",
            "-o", "synth.sample-rate=44100",
            "-c", "8", "-p", "griode"
        ]

I know almost no Python, but I cannot see how that would fail

@worikgh
Copy link

worikgh commented Nov 25, 2020

I downloaded the user manual. I cannot see how to get into set up

I changed the code as you suggested. Buttons green, blue and pink

@worikgh
Copy link

worikgh commented Nov 26, 2020

Got sound!
Had to use qjackctl to connect fluidsynth to sound output.

Happy happy joy joy!

@jpetazzo
Copy link
Owner Author

I found this in the doc:

To switch between Live Mode and Programmer Mode, enter the settings menu by pressing and holding Session briefly. Press the green Scene Launch button to enter Live Mode, or the orange Scene Launch button to enter Programmer Mode.

This is what I'd try to switch modes. Normally when switching modes the grid should go all black ... Then start Griode, and it should show the C scale with red octaves. Fingers crossed :-)

And congrats on qjackctl! I had missed that point in your message; but yes, I am not very familiar with Jack myself (I need to learn it, though) so I never know which extra steps are necessary ...

@worikgh
Copy link

worikgh commented Nov 27, 2020

settings menu by pressing and holding Session briefly The pad does not goblack.
L E D is spelt out across it in bpale blue 'L' and 'D' and light yellow E

20201127_SessionMode

I start griode GRIODE_AUDIO_DRIVER=jack ./griode.py 2>&1 |tee /tmp/griode.log and...

20201127_NoteMode

No change in what I see

This is the output of aconnect -l if that helps

client 0: 'System' [type=kernel]
    0 'Timer           '
    1 'Announce        '
	Connecting To: 128:0, 129:0
client 14: 'Midi Through' [type=kernel]
    0 'Midi Through Port-0'
	Connecting To: 129:0[real:0]
	Connected From: 129:0
client 20: 'pisound' [type=kernel,card=1]
    0 'pisound MIDI PS-0N78HB5'
	Connecting To: 129:0[real:0], 135:0, 133:0, 131:0
	Connected From: 129:0, 138:0, 134:0, 132:0
client 24: 'Launchpad X' [type=kernel,card=2]
    0 'Launchpad X MIDI 1'
	Connecting To: 129:0[real:0], 135:0, 133:0, 131:0
	Connected From: 129:0, 138:0, 134:0[real:0], 132:0
    1 'Launchpad X MIDI 2'
	Connecting To: 129:0[real:0], 131:0
	Connected From: 129:0, 132:0[real:0]
client 130: 'pisound-ctl' [type=user,pid=1114]
    0 'pisound-ctl     '
	Connecting To: 129:0[real:0], 135:0, 133:0, 131:0
	Connected From: 129:0, 138:0, 134:0, 132:0
client 131: 'RtMidiIn Client' [type=user,pid=3046]
    0 'RtMidi input    '
	Connected From: 24:1, 20:0, 24:0, 130:0, 129:0
client 132: 'RtMidiOut Client' [type=user,pid=3046]
    0 'RtMidi output   '
	Connecting To: 24:1[real:0], 20:0, 24:0, 130:0, 129:0[real:0]
client 133: 'RtMidiIn Client' [type=user,pid=3046]
    0 'RtMidi input    '
	Connected From: 24:0, 20:0, 130:0, 129:0
client 134: 'RtMidiOut Client' [type=user,pid=3046]
    0 'RtMidi output   '
	Connecting To: 24:0[real:0], 20:0, 130:0, 129:0[real:0]
client 135: 'griode' [type=user,pid=3054]
    0 'griode          '
	Connected From: 20:0, 24:0, 130:0, 129:0, 138:0[real:0]
client 138: 'RtMidiOut Client' [type=user,pid=3046]
    0 'RtMidi output   '
	Connecting To: 20:0, 24:0, 130:0, 135:0[real:0], 129:0[real:0]

Only one of the Launchpad X's midis is connected to griode. But I kknow less about midi than I do about python

some pads are producing sound

This is the output of the griode command. If it wouldhelp next time I will turn up logging.

/home/patch/griode/palette.py:51: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  data = yaml.load(open("palette.yaml"))
[WARNING] fluidsynth.py:52 __init__() -> Fluidsynth starting
[WARNING] fluidsynth.py:56 __init__() -> Fluidsynth detect audio jack
[INFO] fluidsynth.py:78 __init__() -> Using audio driver: jack
fluidsynth: Jack sample rate mismatch, adjusting. (synth.sample-rate=44100, jackd=96000)
[INFO] fluidsynth.py:109 __init__() -> Found 269 instruments
fluidsynth: Jack sample rate mismatch, adjusting. (synth.sample-rate=44100, jackd=96000)
[INFO] fluidsynth.py:138 __init__() -> Connected to MIDI output griode:griode 135:0
[INFO] griode.py:159 program_change() -> Channel 0 switching to instrument B0 P54: Synth Voice
[INFO] griode.py:159 program_change() -> Channel 1 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 2 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 3 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 4 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 5 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 6 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 7 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 8 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 9 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 10 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 11 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 12 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 13 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 14 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 15 switching to instrument B0 P0: Stereo Grand
[INFO] launchpad.py:11 __init__() -> Opening grid device Launchpad X:Launchpad X MIDI 1 24:0
[INFO] launchpad.py:11 __init__() -> Opening grid device Launchpad X:Launchpad X MIDI 2 24:1
[WARNING] clock.py:61 poll() -> We're running late by -0.5784728527069092 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0012302398681640625 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(1, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(2, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(3, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(4, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(5, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(6, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(7, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 1)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 2)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 3)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 4)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 5)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 6)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 7)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 8)] = 1
[WARNING] launchpad.py:79 __setitem__() -> Raw color used: launchpad[(8, 8)] = 1
[WARNING] clock.py:61 poll() -> We're running late by -0.01220250129699707 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0015180110931396484 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=60 velocity=43 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=60 velocity=0 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=50 velocity=27 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=50 velocity=0 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=50 velocity=15 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=50 velocity=0 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=60 velocity=26 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=60 velocity=0 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=70 velocity=31 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=70 velocity=0 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=70 velocity=24 time=0
[WARNING] launchpad.py:42 process_message() -> Unhandled message: note_on channel=0 note=70 velocity=0 time=0
[WARNING] clock.py:61 poll() -> We're running late by -0.00021314620971679688 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.00033402442932128906 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0034847259521484375 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.05074191093444824 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.13158273696899414 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.15351462364196777 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.2980513572692871 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.06432390213012695 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -1.2813804149627686 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -1.7936341762542725 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.42447924613952637 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.07666349411010742 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.012764692306518555 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.00968027114868164 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.009998559951782227 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.11963605880737305 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.28421854972839355 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.10790491104125977 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.2835261821746826 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.09027934074401855 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.3443174362182617 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -1.7061011791229248 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.33036303520202637 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.13037443161010742 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.14881396293640137 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.2774026393890381 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.04634857177734375 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -3.0329432487487793 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.011593103408813477 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.24080324172973633 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -4.889672517776489 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.4833567142486572 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0038263797760009766 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.15390300750732422 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.1595001220703125 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.1437849998474121 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.18919777870178223 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.026290178298950195 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0027756690979003906 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.25565314292907715 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.2068614959716797 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.5199849605560303 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.06135249137878418 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.024287700653076172 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.26568174362182617 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.16567659378051758 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0009658336639404297 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.022822856903076172 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.23227357864379883 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.04135560989379883 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.016184091567993164 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.1997075080871582 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0014307498931884766 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.01645040512084961 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.22272014617919922 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.002502918243408203 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.006196022033691406 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.2271740436553955 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.03886818885803223 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.023130178451538086 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.03395342826843262 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.008784055709838867 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.2957279682159424 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.03525567054748535 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.005994319915771484 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.6120312213897705 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0010766983032226562 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.053102731704711914 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.11792778968811035 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.019022226333618164 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.018483877182006836 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -1.2374472618103027 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.016217708587646484 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.5558896064758301 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0804293155670166 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.08988499641418457 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.1117696762084961 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.09960484504699707 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -6.314190626144409 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.4272594451904297 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.2235240936279297 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.21440768241882324 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.096527099609375 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -3.185375213623047 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.05290532112121582 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.04369330406188965 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -2.493048906326294 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.6685779094696045 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0191805362701416 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.0014238357543945312 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.005506992340087891 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.009539604187011719 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.07175254821777344 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[WARNING] clock.py:61 poll() -> We're running late by -0.005733966827392578 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).

@worikgh
Copy link

worikgh commented Nov 27, 2020

Update: I am also tryingouy r_cycle. I have issues with that too: Focusrite-Novation/r_cycle#1

After that eperiment I started the Launchpad as above and get:

20201127_NoteMode_II

I cannot quite work out what these colours are....

Clicking custom lets me choose instruments

If it helps here is aconnect -l

patch@patchbox:~/griode $ aconnect -l
client 0: 'System' [type=kernel]
    0 'Timer           '
    1 'Announce        '
	Connecting To: 128:0, 129:0, 136:0
client 14: 'Midi Through' [type=kernel]
    0 'Midi Through Port-0'
	Connecting To: 129:0[real:0]
	Connected From: 129:0
client 20: 'pisound' [type=kernel,card=1]
    0 'pisound MIDI PS-0N78HB5'
	Connecting To: 129:0[real:0], 135:0, 133:0, 131:0
	Connected From: 129:0, 139:0, 134:0, 132:0
client 24: 'Launchpad X' [type=kernel,card=2]
    0 'Launchpad X MIDI 1'
	Connecting To: 129:0[real:0], 135:0, 133:0, 131:0
	Connected From: 129:0, 139:0, 134:0[real:0], 132:0
    1 'Launchpad X MIDI 2'
	Connecting To: 129:0[real:0], 131:0
	Connected From: 129:0, 132:0[real:0]
client 130: 'pisound-ctl' [type=user,pid=1114]
    0 'pisound-ctl     '
	Connecting To: 129:0[real:0], 135:0, 133:0, 131:0
	Connected From: 129:0, 139:0, 134:0, 132:0
client 131: 'RtMidiIn Client' [type=user,pid=4811]
    0 'RtMidi input    '
	Connected From: 24:1, 20:0, 24:0, 130:0, 129:0
client 132: 'RtMidiOut Client' [type=user,pid=4811]
    0 'RtMidi output   '
	Connecting To: 24:1[real:0], 20:0, 24:0, 130:0, 129:0[real:0]
client 133: 'RtMidiIn Client' [type=user,pid=4811]
    0 'RtMidi input    '
	Connected From: 24:0, 20:0, 130:0, 129:0
client 134: 'RtMidiOut Client' [type=user,pid=4811]
    0 'RtMidi output   '
	Connecting To: 24:0[real:0], 20:0, 130:0, 129:0[real:0]
client 135: 'griode' [type=user,pid=4821]
    0 'griode          '
	Connected From: 20:0, 24:0, 130:0, 129:0, 139:0[real:0]
client 139: 'RtMidiOut Client' [type=user,pid=4811]
    0 'RtMidi output   '
	Connecting To: 20:0, 135:0[real:0], 24:0, 130:0, 129:0[real:0]

ANd the output of griode.py


/home/patch/griode/palette.py:51: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
data = yaml.load(open("palette.yaml"))
[WARNING] fluidsynth.py:52 init() -> Fluidsynth starting
[WARNING] fluidsynth.py:56 init() -> Fluidsynth detect audio jack
[INFO] fluidsynth.py:78 init() -> Using audio driver: jack
fluidsynth: Jack sample rate mismatch, adjusting. (synth.sample-rate=44100, jackd=96000)
[INFO] fluidsynth.py:109 init() -> Found 269 instruments
fluidsynth: Jack sample rate mismatch, adjusting. (synth.sample-rate=44100, jackd=96000)
[INFO] fluidsynth.py:138 init() -> Connected to MIDI output griode:griode 135:0
[INFO] griode.py:159 program_change() -> Channel 0 switching to instrument B0 P54: Synth Voice
[INFO] griode.py:159 program_change() -> Channel 1 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 2 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 3 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 4 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 5 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 6 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 7 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 8 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 9 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 10 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 11 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 12 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 13 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 14 switching to instrument B0 P0: Stereo Grand
[INFO] griode.py:159 program_change() -> Channel 15 switching to instrument B0 P0: Stereo Grand
[INFO] launchpad.py:11 init() -> Opening grid device Launchpad X:Launchpad X MIDI 1 24:0
[INFO] launchpad.py:11 init() -> Opening grid device Launchpad X:Launchpad X MIDI 2 24:1
[WARNING] clock.py:61 poll() -> We're running late by -0.6493644714355469 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).
[INFO] griode.py:159 program_change() -> Channel 0 switching to instrument B0 P94: Halo Pad
[WARNING] clock.py:61 poll() -> We're running late by -0.002474546432495117 seconds!
[WARNING] clock.py:65 poll() -> Catching up (deciding that next tick = now).

@jpetazzo
Copy link
Owner Author

Hi!

Sorry, for some reason I had missed the notification about your message above; I just saw your pull request (#17).

This looks like it works!

To understand the modes, scales, etc., perhaps this poster can help?

I'm going to take a look at your PR, and let me know if you have further questions meanwhile!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants