External Synth/Keyboard

Hi, I’m looking through the MIDI stuff at present, as I’m trying to run Patterns from my SC whilst also playing lines/pads from an external synth (a Prophet, REV 2). I see in the help files that running a external keyboard from SC uses a Pbind Pattern chained to Pattern keys.

a = Pbind(\degree, Prand([1, 2, 3, [0, 5]], inf), \bend, Pwhite(0, 76, inf));

// chain a midi event into the pattern and play it 

(a <> (type: \midi, midiout: m)).play; 

// These keys don't seem to have an effect in the Pbind.

This indeed works fine, however, why is it not possible to run these keys straight in a Pbind itself? I’ve tried and hear it doesn’t work, but why is that? I looked at the Pattern help files, Pchain etc and see what’s happening, but somehow I must be missing something.

Thanks in advance.

I’m not completely sure what you mean by “run”, but assuming that you’re trying to control external MIDI hardware with Event Patterns, have you looked at Pattern Guide Cookbook 04: Sending MIDI in the documentation?

There’s nothing about sending MIDI that specifically calls for Pchain / Pattern composition, and everything should indeed be possible within a single Pbind.

1 Like

Thanks, hadn’t seen that. I’d been looking at the MIDIOut section, but was as usual not thorough enough in my search - in the help files. I thought I’d seen something elsewhere awhile ago…!

On the side line: given that you have a prophet rev2, you may be interested in one of my projects to completely control all sound design parameters, as well as randomize parameters, play patterns, design envelopes, change tunings, and more via supercollider. It’s a work in progress, not enough documentation at the moment.

The GUI and the synth automagically remain synchronized if you modify parameters on either side.

It should work with recent prophet OS versions (on PC side it’s only tested on linux, but there’s nothing linux specific in the implementation as far as I can tell)

It also depends on another project of mine: https://github.com/shimpe/panola

One particularly interesting (I think) application that comes with it is the rev2editor, found as part of the included examples.

(Also make sure to configure the synth to listen to and send out NRPN midi messages)

1 Like

Wow, Shiihs, looks very interesting, I’ll head over to Git and take a look. I don’t have time now to try it out but will certainly look over it next week.

Thanks.

p.s. Any recordings (Soundcloud etc) using this set-up?

Well shiihs, I was so curious I ended up installing the quark straight away, however I’m not getting anywhere, so maybe a little help is needed.

I tried running the various midi commands just to check all is there:

MIDIClient.init;
which produces the normal:

-> a ScProphetRev2
MIDI Sources:
MIDIEndPoint(“Rev2”, “Rev2”)
MIDI Destinations:
MIDIEndPoint(“Rev2”, “Rev2”)
-> MIDIClient
-> a MIDIOut

I then tried running you example:

(
~synth = ScProphetRev2.new;
~synth.connect;
~synth.get_patch_from_synth(5, 1, { ~synth.patch_explainer.join("\n").postln; });
)

but only get:

WARNING: couldn’t find MIDI endpoint. Connect failed!.
WARNING: Cannot send commands to synth because not connected yet.
WARNING: Call connect first.
-> a ScProphetRev2

As you can see, SC sees the endpoint, so why am I getting this failed message? Can you give me a little help please. By the way (just in case its important), I’m on a macbook, and connecting via USB to the Rev2.

Thanks in advance.

The piece in the following link was generated by letting supercollider drive the rev2 using only the most basic functionality provided by the system: https://www.youtube.com/watch?v=bJYCof3ViLk but it does nowhere near show all the possibilities of the system.

I haven’t recorded any weirdness yet (although I have heard plenty of “interesting” things while using the system already), but in the future I hope to make some screencasts demonstrating different features.

First the KDE FileDialog hangup bug will have to be solved though because it’s kind of a disaster having the system freeze during recording of a screencast and then having to restart because data entered into the system is lost etc

One of the features is to automatically randomize all kinds of parameters on the synth while playing patterns (it has a 16 voice polyphonic sequencer built-in (which allows not only to sequence notes but also to change all parameter values like cutoff or resonance while it’s playing) and which you can use in combination with the synth’s own gated sequencer for generating interesting sequences) or while playing live. It can lead to the weirdest sounds being generated - things you wouldn’t think are possible by just turning the knobs.

Sorry I have been offline for a while.

You could try to update from git, then call “connect” with the name parameter. Code connecting to midi endpoints seems to be a bit of a challenge (and unfortunately I don’t have other OS at the moment to test it at my side)

(
~synth = ScProphetRev2.new;
~synth.connect(name:"Rev2");
~synth.get_patch_from_synth(5, 1, { ~synth.patch_explainer.join("\n").postln; });
)

Brilliant, I’ll try it and get back to you.

Thanks.

Ok, I tried it, but no luck, same as before - can’t find endpoint.

AArrrggh this is annoying :slight_smile: When you posted the output of your MIDIClient.init, did you copy paste the output into the forum or did you type it out from memory?

So I updated the code on github again, and added some debug code. Can you try the following?
For device, use the first part of the MIDIClient.destinations endpoint, and for name use the second part of the MIDIClient.destinations endpoint.

For example, if

MIDIClient.init;
MIDIClient.destinations;

gives

MIDI Sources:
	MIDIEndPoint("System", "Timer")
	MIDIEndPoint("System", "Announce")
	MIDIEndPoint("Midi Through", "Midi Through Port-0")
	MIDIEndPoint("Rev2", "Rev2 MIDI 1")
	MIDIEndPoint("SuperCollider", "out0")
	MIDIEndPoint("SuperCollider", "out1")
	MIDIEndPoint("SuperCollider", "out2")
	MIDIEndPoint("SuperCollider", "out3")
	MIDIEndPoint("SuperCollider", "out4")
MIDI Destinations:
	MIDIEndPoint("Midi Through", "Midi Through Port-0")
	MIDIEndPoint("Rev2", "Rev2 MIDI 1")
	MIDIEndPoint("SuperCollider", "in0")
	MIDIEndPoint("SuperCollider", "in1")
	MIDIEndPoint("SuperCollider", "in2")
	MIDIEndPoint("SuperCollider", "in3")
	MIDIEndPoint("SuperCollider", "in4")
	MIDIEndPoint("SuperCollider", "in5")
	MIDIEndPoint("SuperCollider", "in6")

You’d use

( 
~synth = ScProphetRev2(); 
~synth.connect(device:"Rev2", name:"Rev2 MIDI 1"); 
~synth.get_patch_from_synth(
    5, 1, { 
       ~synth.patch_explainer.join("\n").postln;
}); 
)

Okay, trying your new version from Git, still getting an error, but not the same. As you can see ScProphetRev2 sees the endpoint:

MIDI Sources:
	MIDIEndPoint("Rev2", "Rev2")
MIDI Destinations:
	MIDIEndPoint("Rev2", "Rev2")
-> MIDIClient
-> [ MIDIEndPoint("Rev2", "Rev2") ]

but when I initialize the code as you suggest, this comes up:

check midi endpoint looking for Rev2: Rev2
connecting to midi endpoint Rev2
-> a ScProphetRev2
ERROR: Message 'patch_explainer' not understood.
RECEIVER:
Instance of ScProphetRev2 {    (0x119438a18, gc=50, fmt=00, flg=00, set=06)
  instance variables [48]
    midi_out : instance of MIDIOut (0x12340bab8, size=3, set=2)
    note_name : instance of Array (0x120efb368, size=121, set=7)
    fine_setting : instance of Array (0x122cb43d8, size=101, set=7)
    lfo_dest : instance of Array (0x11d41c0b8, size=7, set=3)
    mod_dest_53 : instance of Array (0x121248778, size=54, set=6)
    mod_dest_54 : instance of Array (0x121248778, size=54, set=6)
    midi_clock_mode : instance of Array (0x123307508, size=4, set=2)
    midi_clock_cable : instance of Array (0x123307578, size=2, set=2)
    midi_channel : instance of Array (0x1236038d8, size=17, set=5)
    midi_param_sendrecv : instance of Array (0x123307658, size=3, set=2)
    off_on : instance of Array (0x1233075e8, size=2, set=2)
    arp_sustain : instance of Array (0x1233076c8, size=2, set=2)
    midi_usb : instance of Array (0x1233072d8, size=2, set=2)
    midi_out_select : instance of Array (0x123307118, size=4, set=2)
    pot_mode : instance of Array (0x123307188, size=3, set=2)
    seq_pedal_mode : instance of Array (0x123307268, size=4, set=2)
    sustain_polarity : instance of Array (0x1233071f8, size=4, set=2)
    stereo_mono : instance of Array (0x123304fe8, size=2, set=2)
    osc_shape : instance of Array (0x11cbb2f78, size=5, set=3)
    glide_mode : instance of Array (0x123305058, size=4, set=2)
    filter_poles : instance of Array (0x1233050c8, size=2, set=2)
    lfo_shape : instance of Array (0x11d6ee5b8, size=5, set=3)
    mod_source : instance of Array (0x121eb4698, size=23, set=5)
    fx_select : instance of Array (0x1244d5e08, size=14, set=4)
    kbd_mode : instance of Array (0x11c95ee28, size=6, set=3)
    ab_mode : instance of Array (0x1233051a8, size=4, set=2)
    arp_mode : instance of Array (0x11ca5e9e8, size=5, set=3)
    unison_mode : instance of Array (0x1213d0cb8, size=17, set=5)
    divide : instance of Array (0x1244d5cd8, size=13, set=4)
    arp_range : instance of Array (0x123305218, size=3, set=2)
    sequencer_mode : instance of Array (0x12207bb88, size=5, set=3)
    sequencer_type : instance of Array (0x1233052f8, size=2, set=2)
    pan_mode : instance of Array (0x123305288, size=2, set=2)
    foot_assign : instance of Array (0x122665748, size=6, set=3)
    layer_mode : instance of Array (0x123305368, size=3, set=2)
    fx_sync_rate : instance of Array (0x1244d5a78, size=11, set=4)
    tunings : instance of Array (0x1244d5ba8, size=16, set=4)
    pressure_curve : instance of Array (0x123304f78, size=4, set=2)
    velocity_curve : instance of Array (0x121761588, size=8, set=3)
    seq_amount : instance of Array (0x119339f48, size=128, set=7)
    rev2 : instance of Dictionary (0x1233c30f8, size=2, set=2)
    rev2_nrpn : instance of Dictionary (0x123304db8, size=2, set=2)
    rev2_nrpn_globals : instance of Dictionary (0x1243c3bc8, size=2, set=2)
    sysex_bytepos : instance of Dictionary (0x1243c1e58, size=2, set=2)
    global_sysex_bytepos : instance of Dictionary (0x1233c6008, size=2, set=2)
    util : instance of MidiPacker (0x11c5a2168, size=0, set=0)
    last_sysex_stream : instance of Array (0x119535040, size=20521, set=15)
    last_patch_sysex_stream : instance of Array (0x11d958040, size=20521, set=15)
}
ARGS:
CALL STACK:
	DoesNotUnderstandError:reportError
		arg this = <instance of DoesNotUnderstandError>
	Nil:handleError
		arg this = nil
		arg error = <instance of DoesNotUnderstandError>
	Thread:handleError
		arg this = <instance of Thread>
		arg error = <instance of DoesNotUnderstandError>
	Object:throw
		arg this = <instance of DoesNotUnderstandError>
	Object:doesNotUnderstand
		arg this = <instance of ScProphetRev2>
		arg selector = 'patch_explainer'
		arg args = [*0]
	< closed FunctionDef >  (no arguments or variables)
	Meta_MIDIIn:doSysexAction
		arg this = <instance of Meta_MIDIIn>
		arg src = -263989876
		arg packet = <instance of Int8Array>
^^ The preceding error dump is for ERROR: Message 'patch_explainer' not understood.
RECEIVER: a ScProphetRev2

Ok that may actually be better news than it seems.
I think I removed the patch_explainer functionality from the ScProphetRev2 class and into its own PatchDumper class at some point (but forgot to update the documentation). This is very much a pre-alpha quality, sorry about that.

Now instead of using that example, we could feel adventurous and try to open the rev2editor from the HelpSource/examples/ folder, and edit line 8, which currently still states:

p.connect;

to

p.connect(device:"Rev2", name:"Rev2"); // or whatever you had to type to make it connect in the smaller example

Then try to run it, and see if the system comes up.

Also, where did you find my example? In the HelpSource/examples folder there’s one that should work (maybe a bit less ambitious to see if we get this one running first :slight_smile: ) :

(
~synth = ScProphetRev2.new;
~expl = PatchDumper.new;
~synth.connect; // edit as needed!
~synth.get_patch_from_synth(6, 120, {
	~synth.get_global_parameters_from_synth({
		~expl.patch_explainer(~synth.rev2, ~synth.rev2_nrpn_globals).join("\n").postln;
	});
});
)

Ok, still not working, but looks as though its nearly there (from the read out):

check midi endpoint looking for Rev2: Rev2
connecting to midi endpoint Rev2
-> a ScProphetRev2
ERROR: Message 'at' not understood.
RECEIVER:
   nil
ARGS:
   Integer 30
CALL STACK:
	DoesNotUnderstandError:reportError
		arg this = <instance of DoesNotUnderstandError>
	Nil:handleError
		arg this = nil
		arg error = <instance of DoesNotUnderstandError>
	Thread:handleError
		arg this = <instance of Thread>
		arg error = <instance of DoesNotUnderstandError>
	Object:throw
		arg this = <instance of DoesNotUnderstandError>
	Object:doesNotUnderstand
		arg this = nil
		arg selector = 'at'
		arg args = [*1]
	< FunctionDef in Method PatchDumper:lut >
		var signbit = nil
	< FunctionDef in Method PatchDumper:lut >
		var unit = ""
		var value = 44
	PatchDumper:lut
		arg this = <instance of PatchDumper>
		arg constant = 20
		arg offset = 0
		arg mask = -1
		arg norange = false
		arg midivalue = false
		arg includeunit = true
	< FunctionDef in Method PatchDumper:patch_explainer >
		arg offset = 0
		var explanation = [*7]
	< FunctionDef in Method PatchDumper:patch_explainer >
		arg offset = 0
	ArrayedCollection:do
		arg this = [*2]
		arg function = <instance of Function>
		var i = 0
	PatchDumper:patch_explainer
		arg this = <instance of PatchDumper>
		arg rv2 = <instance of Dictionary>
		arg nrpnglobals = <instance of Dictionary>
		var explanation = [*57]
		var cLAYER_MODE = 4190
		var cOSC1_FREQ_A = 0
		var cOSC1_FINE_A = 1
		var cOSC1_SHAPE_A = 2
		var cOSC1_GLIDE_A = 3
		var cOSC1_KBD_A = 4
		var cOSC2_FREQ_A = 5
		var cOSC2_FINE_A = 6
		var cOSC2_SHAPE_A = 7
		var cOSC2_GLIDE_A = 8
		var cOSC2_KBD_A = 9
		var cSYNC_A = 10
		var cGLIDE_A = 11
		var cSLOP_A = 12
		var cOSC_MIX_A = 13
		var cOSC1_NOISE_A = 14
		var cLPF_CUTOFF = 15
		var cLPF_RESONANCE = 16
		var cLPF_KBD_TRACKING = 17
		var cLPF_AUDIO_MOD = 18
		var cLPF_POLES = 19
		var cLPF_ENV_AMT = 20
		var cLPF_ENV_VEL = 21
		var cLPF_ENV_DLY = 22
		var cLPF_ENV_ATT = 23
		var cLPF_ENV_DEC = 24
		var cLPF_ENV_SUS = 25
		var cLPF_ENV_REL = 26
		var cPAN_SPREAD = 28
		var cPRG_VOLUME = 29
		var cAMP_ENVAMT = 30
		var cAMP_VELOCITY = 31
		var cAMP_DLY = 32
		var cAMP_ATT = 33
		var cAMP_DEC = 34
		var cAMP_SUS = 35
		var cAMP_REL = 36
		var cLFO1_FREQ = 37
		var cLFO1_SHAPE = 38
		var cLFO1_AMT = 39
		var cLFO1_DEST = 40
		var cLFO1_CLKSYNC = 41
		var cENV3_DST = 57
		var cENV3_AMT = 58
		var cENV3_VEL = 59
		var cENV3_DEL = 60
		var cENV3_ATT = 61
		var cENV3_DEC = 62
		var cENV3_SUS = 63
		var cENV3_REL = 64
		var cMOD1_SRC = 65
		var cMOD1_AMT = 66
		var cMOD1_DST = 67
		var cENV3_RPT = 97
		var cOSC1_NOTERESET = 99
		var cOSC1_SHAPEMOD_A = 102
		var cOSC2_NOTERESET = 104
		var cLFO1_KEYSYNC = 105
		var cOSC1_SUBOSC = 110
		var cGLIDE = 111
		var cPITCHBENDRANGE = 113
		var cPANMODE = 114
		var cMODWHEEL_AMT = 116
		var cMODWHEEL_DST = 117
		var cPRESSURE_AMT = 118
		var cPRESSURE_DST = 119
		var cBREATH_AMT = 120
		var cBREATH_DST = 121
		var cVELOCITY_AMT = 122
		var cVELOCITY_DST = 123
		var cFOOTCTRL_AMT = 124
		var cFOOTCTRL_DST = 125
		var cFX_ONOFF = 153
		var cFX_SELECT = 154
		var cFX_MIX = 155
		var cFX_PARAM1 = 156
		var cFX_PARAM2 = 157
		var cFX_CLKSYNC = 158
		var cABMODE = 163
		var cUNISON_DETUNE = 167
		var cUNISON_MODE = 168
		var cKEYMODE = 170
		var cSPLITPOINT = 171
		var cARP_OFFON = 172
		var cARP_MODE = 173
		var cARP_RANGE = 174
		var cARP_CLK_DIV = 175
		var cARP_RPTS = 177
		var cARP_RELATCH = 178
		var cBPM_TEMPO = 179
		var cGATED_SEQMODE = 182
		var cGATED_SEQPOLY = 183
		var cSEQ1_DST = 184
		var cSEQ1_GATED_STEP1_TRACK1 = 192
		var cSEQ1_POLY_NOTE1_STEP1 = 276
		var cSEQ1_POLY_NOTE1_VEL1 = 340
		var cLAYERA_CHAR1 = 20000
		var analyze_globals = <instance of Function>
		var analyze_header = <instance of Function>
		var analyze_osc = <instance of Function>
		var analyze_lowpassfilter = <instance of Function>
		var analyze_amplifier = <instance of Function>
		var analyze_lfo = <instance of Function>
		var analyze_modulations = <instance of Function>
		var analyze_auxiliary_envelope = <instance of Function>
		var analyze_fx = <instance of Function>
		var analyze_arp = <instance of Function>
		var analyze_sequencer = <instance of Function>
		var analysis_header = <instance of Dictionary>
	< closed FunctionDef >  (no arguments or variables)
	Meta_MIDIIn:doSysexAction
		arg this = <instance of Meta_MIDIIn>
		arg src = -263989876
		arg packet = <instance of Int8Array>
^^ The preceding error dump is for ERROR: Message 'at' not understood.
RECEIVER: nil

This time it sees the Rev2 and reads its parameters. So what’s (or where’s) the ‘at’ problem?

Thanks for all the work you’re putting in.

I’ll have to check when I’m back from work, but do you know which version of the Prophet OS you are running on your rev2?

Same as you, I’ll check when I’m back from work. But I’m still running one of the original versions (bought mine about a year ago) - it’s an 8 voice, not 16 like yours.

Ok, just checked my OS version (Rev2): is 1.1.4.27

So, tried running the above code again, but no luck, same message:

check midi endpoint looking for Rev2: Rev2
connecting to midi endpoint Rev2
-> a ScProphetRev2
ERROR: Message 'at' not understood.
RECEIVER:
   nil
ARGS:
   Integer 30
CALL STACK:
	DoesNotUnderstandError:reportError
		arg this = <instance of DoesNotUnderstandError>
	Nil:handleError
		arg this = nil
		arg error = <instance of DoesNotUnderstandError>
	Thread:handleError
		arg this = <instance of Thread>
		arg error = <instance of DoesNotUnderstandError>
	Object:throw
		arg this = <instance of DoesNotUnderstandError>
	Object:doesNotUnderstand
		arg this = nil
		arg selector = 'at'
		arg args = [*1]
	< FunctionDef in Method PatchDumper:lut >
		var signbit = nil
	< FunctionDef in Method PatchDumper:lut >
		var unit = ""
		var value = 134
	PatchDumper:lut
		arg this = <instance of PatchDumper>
		arg constant = 20
		arg offset = 0
		arg mask = -1
		arg norange = false
		arg midivalue = false
		arg includeunit = true
	< FunctionDef in Method PatchDumper:patch_explainer >
		arg offset = 0
		var explanation = [*7]
	< FunctionDef in Method PatchDumper:patch_explainer >
		arg offset = 0
	ArrayedCollection:do
		arg this = [*2]
		arg function = <instance of Function>
		var i = 0
	PatchDumper:patch_explainer
		arg this = <instance of PatchDumper>
		arg rv2 = <instance of Dictionary>
		arg nrpnglobals = <instance of Dictionary>
		var explanation = [*57]
		var cLAYER_MODE = 4190
		var cOSC1_FREQ_A = 0
		var cOSC1_FINE_A = 1
		var cOSC1_SHAPE_A = 2
		var cOSC1_GLIDE_A = 3
		var cOSC1_KBD_A = 4
		var cOSC2_FREQ_A = 5
		var cOSC2_FINE_A = 6
		var cOSC2_SHAPE_A = 7
		var cOSC2_GLIDE_A = 8
		var cOSC2_KBD_A = 9
		var cSYNC_A = 10
		var cGLIDE_A = 11
		var cSLOP_A = 12
		var cOSC_MIX_A = 13
		var cOSC1_NOISE_A = 14
		var cLPF_CUTOFF = 15
		var cLPF_RESONANCE = 16
		var cLPF_KBD_TRACKING = 17
		var cLPF_AUDIO_MOD = 18
		var cLPF_POLES = 19
		var cLPF_ENV_AMT = 20
		var cLPF_ENV_VEL = 21
		var cLPF_ENV_DLY = 22
		var cLPF_ENV_ATT = 23
		var cLPF_ENV_DEC = 24
		var cLPF_ENV_SUS = 25
		var cLPF_ENV_REL = 26
		var cPAN_SPREAD = 28
		var cPRG_VOLUME = 29
		var cAMP_ENVAMT = 30
		var cAMP_VELOCITY = 31
		var cAMP_DLY = 32
		var cAMP_ATT = 33
		var cAMP_DEC = 34
		var cAMP_SUS = 35
		var cAMP_REL = 36
		var cLFO1_FREQ = 37
		var cLFO1_SHAPE = 38
		var cLFO1_AMT = 39
		var cLFO1_DEST = 40
		var cLFO1_CLKSYNC = 41
		var cENV3_DST = 57
		var cENV3_AMT = 58
		var cENV3_VEL = 59
		var cENV3_DEL = 60
		var cENV3_ATT = 61
		var cENV3_DEC = 62
		var cENV3_SUS = 63
		var cENV3_REL = 64
		var cMOD1_SRC = 65
		var cMOD1_AMT = 66
		var cMOD1_DST = 67
		var cENV3_RPT = 97
		var cOSC1_NOTERESET = 99
		var cOSC1_SHAPEMOD_A = 102
		var cOSC2_NOTERESET = 104
		var cLFO1_KEYSYNC = 105
		var cOSC1_SUBOSC = 110
		var cGLIDE = 111
		var cPITCHBENDRANGE = 113
		var cPANMODE = 114
		var cMODWHEEL_AMT = 116
		var cMODWHEEL_DST = 117
		var cPRESSURE_AMT = 118
		var cPRESSURE_DST = 119
		var cBREATH_AMT = 120
		var cBREATH_DST = 121
		var cVELOCITY_AMT = 122
		var cVELOCITY_DST = 123
		var cFOOTCTRL_AMT = 124
		var cFOOTCTRL_DST = 125
		var cFX_ONOFF = 153
		var cFX_SELECT = 154
		var cFX_MIX = 155
		var cFX_PARAM1 = 156
		var cFX_PARAM2 = 157
		var cFX_CLKSYNC = 158
		var cABMODE = 163
		var cUNISON_DETUNE = 167
		var cUNISON_MODE = 168
		var cKEYMODE = 170
		var cSPLITPOINT = 171
		var cARP_OFFON = 172
		var cARP_MODE = 173
		var cARP_RANGE = 174
		var cARP_CLK_DIV = 175
		var cARP_RPTS = 177
		var cARP_RELATCH = 178
		var cBPM_TEMPO = 179
		var cGATED_SEQMODE = 182
		var cGATED_SEQPOLY = 183
		var cSEQ1_DST = 184
		var cSEQ1_GATED_STEP1_TRACK1 = 192
		var cSEQ1_POLY_NOTE1_STEP1 = 276
		var cSEQ1_POLY_NOTE1_VEL1 = 340
		var cLAYERA_CHAR1 = 20000
		var analyze_globals = <instance of Function>
		var analyze_header = <instance of Function>
		var analyze_osc = <instance of Function>
		var analyze_lowpassfilter = <instance of Function>
		var analyze_amplifier = <instance of Function>
		var analyze_lfo = <instance of Function>
		var analyze_modulations = <instance of Function>
		var analyze_auxiliary_envelope = <instance of Function>
		var analyze_fx = <instance of Function>
		var analyze_arp = <instance of Function>
		var analyze_sequencer = <instance of Function>
		var analysis_header = <instance of Dictionary>
	< closed FunctionDef >  (no arguments or variables)
	Meta_MIDIIn:doSysexAction
		arg this = <instance of Meta_MIDIIn>
		arg src = -263989876
		arg packet = <instance of Int8Array>
^^ The preceding error dump is for ERROR: Message 'at' not understood.
RECEIVER: nil

I get the same error you do with that example… Need to test a bit.

No problem, let me know when you have an idea to test.