Start a new topic

Orba hacking knowledge base

This thread is intended to gather the feedback of Orba tinkerers.

28 people like this idea

Major new findings for Orba 2 via ESP32 Serial connection. I found the secret orba:// files and other interesting goodies.

2 people like this

Here's the 16 semitones that I was imagining. NOTE: Orba App must have Pitch Bend Scaling at 25%.

2 people like this

@BJG145 Yes I have been considering allowing users to choose the starting.orbapreset file and the destination.orbapreset file. I'm not sure what's possible within a browser. Those will definitely be things I will consider. I will share prototype design issues before I code anything.. Likely a few weeks out.

Love the Hang Drum idea.. I wanted one of those years ago was never able to find one for a reasonable price.

2 people like this

Okay I've got it figured out :) Let's use DPC as the example. BeatLengthTicks = 480, so 480 ticks per quarter note. The correct 8 byte sequence is:

  1. Command (16 is PlayNote but there are likely other for CC values etc..)
  2. Relative Start Tick [LSB] since last (event or note unknown)
  3. Relative Start Tick [MSB]
  4. MIDI Note #
  5. Velocity ON (1-127 follows 7 bit MIDI standard)
  6. Velocity OFF (1-127 follows 7 bit MIDI standard)
  7. Duration in Ticks [LSB]
  8. Duration in Ticks [MSB]

Let's look at the first 2 DPC notes. 

MemIdx = 0 - MIDI Note at tick 7, channel 1, note 62, duration 501, von 120, voff 90
  1. 16 (Play Note Command)
  2. 7 [LSB]
  3. 0 [MSB]
  4. 62 (MIDI Note)
  5. 120 Von
  6. 90 Voff
  7. -11 [LSB]
  8. 1 [MSB]

To calculate the value they are using two's compliment for negative numbers. I'll skip the calculation for the first start Tick (7&0) at position 2&3 as it trivial to derive 7. Now let's look at the first duration -11 & 1. This can be calculated as (11^255)+1+1<8 = 501. You can use the Windows Calculator to work this out quite easily in Programmer Mode:


Let's look at the next:
MemIdx = 8 - MIDI Note at tick 1888, channel 1, note 64, duration 495, von 127, voff 92
  1. 16
  2. 89
  3. 7
  4. 64
  5. 127
  6. 92
  7. -17
  8. 1
Let's start with the start Ticks. This can be calculated as 89+7<8 + 7(lastStartTick) = 1888


And finally the second duration (17^255)+1+1<8 = 495


With this knowledge it would be fairly straightforward to write a script to quantize a song file but doing it on the device would not be possible.

The fact that they used relative tick values was a really poor choice in my opinion. I feel this way because quantizing one note would have an impact on all the notes that follow since they are all relative to the previous. I suspect they will convert this to absolute for the Orba 2.

2 people like this

Starting to hack the Orba 2. I'm able to assign custom samples to each pad by editing the .artipreset files

2 people like this

@StefanGick - Your Wish has come True! 

2 people like this

...a couple of minutes' work with a hot glue gun, and voila - the Orba Diabolo.


Hot glue is great. It holds things quite securely, but if you change your mind you can break it off.

WIth the new-found scale knowledge I can configure this beauty for over an octave chromatic, or self-accompany with chords+lead.   

2 people like this

Many thanks to everyone for all the tips and very cool presets!!!

Especially like Andrea's note re. diatonic tuning any preset. Very fun!

2 people like this

Its a custom protocol I think. I see this with certain apps. For example you can define something like reddit://web/r/orba and if you clicked that link, (if you OS knows the protocol) it would open your reddit App and go directly to the Orba group. I can push samples into the orba 2 and download them back out via the app for user sounds.. but the preset sound samples are already in the device when you get it without ever needing to connect to the app. Switching patches is fast because they are already stored on the device and the app just tells Orba which to select.

I'm glad you're getting on the Orba 2 train. It is a little frustrating but Artiphon just released a new version of the app that lets you save songs and new firmware. They have deserialized many of those Base64 strings so editing can be done so much easier now. Many of those things we found /wrt to Orba 1 are starting to make sense now that its becoming much more human readable. This thing has way more potential.. I think it also accepts those "Melodic Minor" things we explored in the past but I need more work to see what it actually accepts. Really looking forward to hacking with you again. Soon I will start up a Orba 2 hacking group once I have some of the basics down. 

2 people like this

@BJG145 said:

  • "Everything generally has a set of <ModifierEntry> containing and a set of <SeekerEntry>."
  • "We know that modifierData controls chords. We don't know what seekerData does, if anything, but copying seekerData entries from chord files to lead ones causes the Lead button to play chords. (At least it does on one of my Orbas, but not the other; can other people recreate that?)"

I thought I read somewhere on one of these forums that the <ModifierEntry> and <SeekerEntry> nodes correspond with the gestures. So the reason there are 9 nodes is because they would correlate to:

Tap, Press, Vibrato, Radiate, Slide, Bump, Move, Shake, Tilt

Perhaps the SeekerEntry for Chords has something to do with how the Tap works (i.e. send 4 notes at once). I may convert the OrbaModifierDataFiddler.html to be even more generic since we don't really care about modifying chord data in this way anymore. I may change it so that you can paste any Base64 string in and it will decode the values in a table which can be edited, then you can just `Copy to Clipboard` and paste it back from whence it came. 

The Uuids are just unique identifiers. They may be used to see if something has changed. Come to think of it that might be why some of the changes I made didn't take effect. Maybe if the Uuids don't change the Orba just thinks: "I already have this data so no need to update"?

@BJG145 said:

  • 'But I think there's probably a lot of stuff that just isn't needed; for instance, each section in the "Song" file has a "quantisation" setting. Sore point, I know, and it doesn't seem to do anything. I expect parts of the code are redundant; inactive, but there may be undiscovered sections that could bring features like the custom chords to life.'

I think there may be some prep work for Orba 2 here. I would imagine that the Orba 2 will use the .orbapreset and .song file formats too..

@BJG145 said:

  •  "I'm not sure what's meant to happen when you click the "Download" button...tried Edge/Chrome but I don't think it's doing anything. I can't find the file in the Downloads folder."

'Download' should download the new .orbapreset file to your downloads folder. I wonder if you are getting an error for some reason? Look up how to open the developer panel in your browser and see if it reports and errors when you click download. I might have to fix something. I haven't written any instructions yet because I don't think its quite solid yet but the idea is:

  0. No more Daemons needed

  1. Drag & Drop a Chord Preset into the 'Starting Template' Box

   - If it worked, you'll see the name reflected, the Chord Offsets updated and the 'Save As' filename updated.

 2. Make changes to the Offsets as desired. Press the Pad buttons to hear/see the real-time changes.

 3. Alternatively, switch to Bass or Lead mode and choose scales. This is not intuitive at all since the Editor will save the Chord voice you loaded but with the scale adjustments. Press the Pad buttons to hear/see the changes

 4. When you are happy with your edits, Click 'Download'. This will download a file with the name specified in the Save As filename box.

 5. Take the downloaded file and place it into a Preset folder


  • "For the Drum presets, these have a shorter list of four matched Modifier/Seeker entries. "

This would make sense if Modifier/Seeker are related to the 9 gestures. Tilt/Radiate/Vibrato wouldn't really make sense for drums. I'm curious though if there's anything special for the 'Shake' gesture.


  • "It's interesting that to change sounds, you need to load a preset, but you can change the key on the fly via the App. It's sending some kind of data directly/immediately. I was wondering if it might be possible to somehow access the file system on the ESP32 and read/change data on the Orba directly."

Its easy for me to calculate the MIDI note numbers so I just send them to the Orba. I would love to be able to send Major/Minor mode change or Key change but those are likely not MIDI messages. They might be good old fashion SYSEX messages but that's for another day. I was interested in digging more there but really wanted to finish the Editor first. Firmware hacking is something I don't think I'll ever do. That would be extremely time consuming and I don't have the expertise. 

2 people like this

I also had a scour of the application itself and found lots of xml. Here is a sample:


  <TuningList category="percussion" keySelection="false">
    <TuningEntry name="All Kicks" />
    <TuningEntry name="Drum Kit" />
    <TuningEntry name="Electro Kit" />
  <TuningList category="tonal" keySelection="true">
      <TuningEntry name="Major"            type="tonal" intervals="P1, M2, M3, P4, P5, M6, M7, P8" />
      <TuningEntry name="Natural Minor"    type="tonal" intervals="P1, M2, m3, P4, P5, m6, m7, P8" />
      <TuningEntry name="Harmonic Minor"   type="tonal" intervals="P1, M2, m3, P4, P5, m6, M7, P8" />
      <TuningEntry name="Melodic Minor"    type="tonal" intervals="P1, M2, m3, P4, P5, M6, M7, P8" />
      <TuningEntry name="Major Pentatonic" type="tonal" intervals="P1, M2, M3, P5, M6, P8, M9, M10" />
      <TuningEntry name="Minor Pentatonic" type="tonal" intervals="P1, m3, P4, P5, m7, P8, m10, P11" />
      <TuningEntry name="Dorian"     type="tonal" intervals="P1, M2, m3, P4, P5, M6, m7, P8" />
      <TuningEntry name="Phrygian"   type="tonal" intervals="P1, m2, m3, P4, P5, m6, m7, P8" />
      <TuningEntry name="Lydian"     type="tonal" intervals="P1, M2, M3, A4, P5, M6, M7, P8" />
      <TuningEntry name="Mixolydian" type="tonal" intervals="P1, M2, M3, P4, P5, M6, m7, P8" />
      <TuningEntry name="Locrian"    type="tonal" intervals="P1, m2, m3, P4, d5, m6, m7, P8" />

 I also found lots of svg sources which I pasted into html docs. These are mostly UI elements but might lead to clues.. 

(190 KB)
(4.37 MB)

1 person likes this

If you edit the Orba application in Notepad++ and search for text parameters from the XML like "RetainNotes", you can find alternatives that I haven't seen in the XML, like "RetainIntervals".

 A typical tuning entry looks like this:

  <TuningEntry key="C" name="Major Pentatonic" intervals="P1, M2, M3, P5, M6, P8, M9, M10"

               midiOctave="3" transpositionType="RetainNotes" type="tonal" tuning="60, 62, 64, 67, 69, 72, 74, 76"/>

So far we haven't found any result from changing the "intervals" list, only the "tuning" values. I think that may be because the transpositionType is set to "RetainNotes", but if you change it to the alternative "RetainIntervals" value found in the App code, I reckon that's where the "intervals" string might start changing things.

I reckon it might be something to do with the way the chord sequence change when you change key in the App. I got some different result from it at one point, but couldn't then recreate it.

It might be worth scouring the code for other parameter values like this that we don't know about.

1 person likes this

Try playing the Orba on a flat surface.. it will emit less CC data and mostly Note data. Also this may help you to decode the values. If you can get me the serial data log and the corresponding eventData I might be able to figure it out. I've got a good understanding of MIDI messages and hex and binary data. 

1 person likes this

Oh... You must have a background in marketing!

1 person likes this
Winbond 25x40CL (not far from the AKM DAC) is a 4Mb (ie 512KB) serial flash memory.

1 person likes this
Login or Signup to post a comment