Start a new topic

Orba hacking knowledge base

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

27 people like this idea

>"With the dfu-util writes, we see all the parameters for the command, but with the writes, we don't."

I'm mainly interested in reading the Winbond chip now, and I haven't figured that out yet. However, I think I've extracted the esp.pytool parameters FWIW. 

I tried running running the artiphon_esp32_programmer command from the log while the Orba was already in programming mode. Usually it tries to do that itself, so I think it was surprised and reported some additional info.

I've attached the log, but the bit I was interestyed in was:

Programming attempt failed: CalledProcessError(2, ['D:\\orba\\fresh\\esptool.exe', '--chip', 'esp32', '--port', '\\\\.\\COM12', '--baud', '115200', '--before', 'no_reset', '--after', 'no_reset', 'write_flash', '-z', '--flash_mode', 'dio', '--flash_freq', '40m', '--flash_size', 'detect', '0x1000', 'C:\\Users\\admin\\AppData\\Local\\Temp\\tmp7snsjpvc\\bootloader.bin', '0x10000', 'C:\\Users\\admin\\AppData\\Local\\Temp\\tmp7snsjpvc\\delorean.bin', '0x8000', 'C:\\Users\\admin\\AppData\\Local\\Temp\\tmp7snsjpvc\\partitions_singleapp.bin'])

Usually it just says...

Programming files {'app': 'C:\\Users\\admin\\AppData\\Local\\Temp\\tmpg15gztml\\delorean.bin', 'bootloader': 'C:\\Users\\admin\\AppData\\Local\\Temp\\tmpg15gztml\\bootloader.bin', 'partitions': 'C:\\Users\\admin\\AppData\\Local\\Temp\\tmpg15gztml\\partitions_singleapp.bin'}

...but this different version shows the addresses and other parameters for the command. 

I've noticed a Windows version of this utility, esptool.exe, in one of the update folders, and I expect this is what flash-from-file uses.

I've realised that I was wrong about the consecutive writes to the same address for bootloader and delorean; I'd misread a zero. bootloader goes to 0x00001000, and delorean goes to 0x00010000.

There's some info on P29 of the ESP32 Technical Reference Manual about memory mapping for external flash (Winbond?), but I haven't managed to do anything with it. If I try pointing at one of the addresses there like 0x3F400000, it gives an error about how it can't handle over 16MB, so I'm not getting that right. 


@BJG145 said:


  • "If your theory about the lists of Modifier/Seeker values representing different gestures is correct, then maybe it's in the SeekerData for the entry corresponding to the bump gesture."

I just found Ian Halbwachs' Github repo that appears to confirm this?!

His Preset has comments:
    <!-- tap [note] -->
    <ModifierEntry chainIndex="0" gestureUuid="4f36e6ea-9135-4163-b3ac-63ec98d9f7c7" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="89930c9a9e51427d91fd15bb03f60c2a"/>
    <!-- tilt [cc1] -->
    <ModifierEntry chainIndex="0" gestureUuid="4620991b-b32e-4150-a35d-2d54b9501a75" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="a207ab4a68274bc18796031750ccd06f"/>
    <!-- vibrato [pitch wheel] -->
    <ModifierEntry chainIndex="0" gestureUuid="38ca5c83-e834-43fa-a549-0543cf578fc3" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="eca7882cd43345c4b48bbb37cd31807e"/>
    <!-- spin [cc 112] -->
    <ModifierEntry chainIndex="0" gestureUuid="61f2d792-abb1-4b4c-867b-1223c81d778c" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="0d0516f18bc74f3483d34606afa3716a"/>
    <!-- radiate [cc74] -->
    <ModifierEntry chainIndex="0" gestureUuid="78ee1f95-c038-4a25-bb09-ef2229ae30a1" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="8f5196ee5add409798612be0c333e005"/>
    <!-- press [channel pressure] -->
    <ModifierEntry chainIndex="0" gestureUuid="b1831b9b-40c1-45fc-afb9-0e07beb83663" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="9bda1c4b83454bc1bee3046d8bb7269a"/>
    <!-- shake note [note 69] -->
    <ModifierEntry chainIndex="0" gestureUuid="e0ae0484-10a1-44d6-8873-dcd6ae2cf70f" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="dc13a7d2c19a4acfb9f435eff54f4ff5"/>
    <!-- shake cc [cc 2] -->
    <ModifierEntry chainIndex="0" gestureUuid="2a2a40b7-e73d-4b48-b959-bf196a0dc749" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="133f78c514fd42b88eda7f4b9547b2a9"/>
    <!-- move cc [cc 113] -->
    <ModifierEntry chainIndex="0" gestureUuid="ea1d7a41-2175-4b9f-baf1-d6cfeb9913e7" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="8432126dd86b4974a40506a6522995e2"/>
    <!-- bump [note 39] -->
    <ModifierEntry chainIndex="0" gestureUuid="aa95f4bc-a1ce-4eb6-a455-2e8353218620" modifierData="..." modifierUuid="1ec43ffb-15db-4708-b21b-cf2ce372e3fc" prioIndex="0" uuid="f0710a10ed704d36a95061859d9eb020"/>


@BJG145 Aha! I did read something about the ports. What program is that displaying the ports above? Is that Live? Also are you able to see the ports in the Settings on this site?

Now I'm wondering if we could apply other chord voicing(s) on a Tilt Gesture as an example?!

...interesting. I've just realised that if you move or rename the Presets folder, then run the App and open a Song, it recreates it. So even though the Song XML doesn't contain these Modfier lists, that info is evidently floating around and being used.

>" Also are you able to see the ports in the Settings on this site?"

Yep. (Haven't tested.)


@ Gabriel Velasco. I you don't trust your ears then use an app.

It makes sense that there is header data which seems to correspond with this:

                loopBarEndTolerance: 120
                beatLengthTicks: 480
                notesPerBar: 4
                quantMode: 1
                quantStartSnapTicks: 120
                quantBarEndSnapTicks: 240
                allowRecordingSilenceStart: 1
                allowRecordingSilenceEnd: 0
                thinnerMode: 1
                cc_error_limit: 1000
                pbend_error_limit: 25000
                ccA: 1
                ccB: 74
                ccC: 75
                thickenerMode: 1
                thickenerEmitPrd: 20
                thickenerMaxDt: 5000
                noteStartWindow: 240

You said that indexes 0-17 appear to be the header and there are 18 values here. Base64 gets converted to an array of 8-bit numbers (0-255) but some of these values require less space (booleans such as thickenerMode 0/1 only requires 1 bit) and some are larger requiring two bytes. I'm not sure how these are packed but I'm really hoping they match the headers above. I've been quite busy that last 3-4 days and haven't had much of a chance to dig in. Fortunately, I rebuilt my PC and have my Windows machine back up (with better hacking tools than my Mac).

The ability to use a gesture to change chord voicings sounds really cool! But, I think it would be neat to map the radiate gesture to that.

It reminds me of an IOS app called Sound Prism  which turns the screen in to a sortof grid controller. Left to right you have 7 lanes for the 7 diatonic chords. top to bottom you have voicings if you slide your finger top to bottom, you get a sortof chord glisando. But if you just tap the chord in one place, you get a static inversion of the chord, then you can tap slightly higher or lower on the screen to change the voicing dynamicly.

That would be really cool to do on the orba changing your position on the pad from top to bottom.

Just some notes on workflow...

I've now been abloe to record a set of songs with tap-only data. The method is:

1) Load 1981 and quit the app

2) Create a copy of the 1981 Lead preset with tap only (first Seeker/Modifier only) and Major scale

3) Record a sequence

4) Run the app and quit it again, saving the song

5) Make a copy of the new song file version the App has created and give it a suitable name

6) Clear the sequence and repeat from (3)

Usually the App makes successive copies a song as you record new sequences, but after feeding it a tap-only Lead preset I couldn't get it to go beyond the first one.


I've found that the console event list posted above shows live events while recording; I don't think you can get that view during playback.

The Looper info logs (1-4 in consoel) are a bit strange. If you record with sequences in the console, they get populated, but if you load a song containing event data, they don't. However, if you record another note on the end, then that shows up, and the previous data shows up too.

The Looper info log for this song that you're extending displays in a "live" readout kind of way; if you keep tapping the relevant number for that loop (Bass/Lead/Chord/Drums) whie it's playing, it shows all the info up to that point. 

So to recap, to get the console Looper info from a song you've loaded from the App, you need to:

1) Quit the App

2) Turn the Orba off and on again

3) Connect via eg Putty

4) Put the Orba in Record mode

5) Add another note to the sequence you've recorded

6) Tap the relevant loop button (1-4) just as the loop ends  

CakeWalk! I used that 30 years ago!! Its still around :)

...yep, it's free now, and pretty good...:-)

...I wasn't aware of its history. I used it for years as Sonar by Cakewalk; they finally packed it in and it was released for free as "Cakewalk by Bandlab". But, yes, apparently "Sonar" started as "Cakewalk" by a company called "Twelve Tone" back in 1987, with the company eventually adopting that name. And, yeah, it's good; probably the best free DAW for Windows.

@ Subskybox

"I could build a MIDI => SONG converter in the future."

That would be something ... When Orba came out it could save songs to midi and even avi (be it not perfect so it was removed from the app).

Here are some files from a duration/timing test. There's an MP3 of the loop, and a CSV giving data from:

1) MidiOx MIDI monitor (from Orba's USB/MIDI)

2) loopData

3) Decoded eventData

4) Console data (with extra final note in order to generate the report)

The loop is all on one note, and consists of:

1) Two notes with duration of 1 click, separation of 1 click

2) Two notes with duration of 2 clicks, separation of 2 clicks

3) Two notes with duration of 3 clicks, separation of 1 click

Looking at eventData, there's an unknown negative value after release velocity. This is followed by a value that's 1 for the first two notes, 3 for the second two notes, and 5 for the last two, so it looks like that's related to duration. 

Login or Signup to post a comment