Start a new topic

Orba hacking knowledge base

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


29 people like this idea

If you've added some custom scales (e.g. Hang Drum + Whole Tone) can you share up the orba-scales.json file? I can merge it in later... I have a few scales I'd like to add but too interested in figuring out the gesture mapping. How does the SeekerData bind a gesture with a control? I'm thinking index 1 because its unique across all seekerData. Index 0 seems to be gestureType (0 or 1) but one (or more) of those values must link the gesture to the midi message or control # 


1 person likes this

Sure here's the patch. On another note, I think I can confirm that Spin Pitchbend will never work. I've been monitoring the midi output from the spin gesture. It sends spin velocity not spin position. I think that video was built before the product was done. You can tell the sound is overdubbed. I think they wanted it to work like that but the esp32 likely did have the "spin" they imagined. It would need a compass to be position, instead it outputs how fast its spinning. Still, it could be useful for changing key or something useful like effect levels.


1 person likes this

Quick undecoded seekerUuid comparison from the utility presets. (At the moment I'm basically trying to understand the structure of the Modifier/Seeker pairs in order to try and construct a different one.)

 

bump / tap / shake note

accc8538-d6cf-4b68-88f2-b99400fad3d1


move / tilt

1cc30432-c214-4c6a-97ab-491975e412d6


spin

2cc30432-c214-4c6a-97ab-491975e412d6


radiate

3cc30432-c214-4c6a-97ab-491975e412d6


shake cc

4cc30432-c214-4c6a-97ab-491975e412d6


press

64358c1f-2ef5-4fd0-b3fd-ad8c4f93b839


vibrato

6e2b617b-4c1e-4752-96fb-2ac707909aad


*************************************************


The fact that bump, tap, and shake note all share the same value seems to make sense; they all do the same thing. They all play a note.


Interesting that move/tilt share a value, then spin, radiate and shake cc all just increment the first character; 1, 2, 3, 4. The rest of the string is shared.


Press and Vibrato are outliers.


1 person likes this

I just tried running the artiphon_esp32_programmer command that handles the esptool.py transfers, and that didnt toggle quantise either, so I'm coming to the conclusion that it might be something that's done by the Orba App itself outside the events in the log.


I noticed something else a bit strange about quantise and the App. It goes like this:


1) Play a song with quantise enabled, all fine.


2) Run the App and load a song containing eventData with quantisationMode set to 1 (so that the icon appears), but playback is non-quantised.


3) Quit the App, turn the Orba off and on again, and play the song. It's the one you loaded from the App, playing quantised.


...so it seems that quantisation is enabled throughout, but playback in the App when you initially load the new song is without it.


I also wondered if quantisation enabled/disabled is separate from quantisationMode=0/1/2, and console "q" changes both.


1 person likes this

I've attempted to carry out all the file flashing from the log, but none of it toggled quantise. 


Here are some notes on the procedure for reference. (I've attached a copy of the application's flash log, and my manual version.)


* * * * *


The Orba begins in DFU mode. The transfers start by using dfu-util to do something with the small system file option_bytes.bin that seems to involve grabbing it and then sending it back with different parameters. Then dfu-util sends the larger 0x00002000.bin and 0x00008000.bin files. 


Next a custom program called orba_capsense_bootloader resets the touch sensor via 21_X0_CY8C_Touch_A0_2988ebe.cyacd


The Orba restarts so it's no longer in DFU mode, and is set to programming mode. Another 

custom program called artiphon_esp32_programmer transfers the three files from the firmware zip; delorian.bin, bootloader.bin and partitions_singleapp.bin


The commands for dfu-util can be copied and pasted from the application's log. The parameters for esptool.py are a bit more obscure, and you have to have to switch in and out of various modes at different points to carry out the steps and check the state of quantise, using console "B" to put it in programming mode before guessing at the esptool.py parameters. 


You need to turn the Orba on and off at various points to work on it via the different programs; eg if you run the App you need to quit it and switch off and on before using Putty. You need to quit Putty before you can use esptool.py.

 

 

 

 

 

 

 

 

 

txt
txt

1 person likes this

I've been taking another look at the change log, and some of the comments are quite interesting.


0.12.3

Fix major issue sysex messages would not be transmitted by ESP32 to STM32 in many cases

Default pitch bend range set to 2 from 48


0.13.1

Fixed issue where Orba could crash if the play surface was extensively palmed


0.13.7

Added root notes and scale to pattern data

Added song root note and scale to Orba metadata


0.13.16

Changed default looper mode to allow up to 1 bar of silence at start of loop, first notes played back as recorded on time grid rather than snapped to start of loop.


0.14.0

Added feature where loops are 'intelligently' ended and notes at the end of the first bar can move to the end of the loop. Loop now ends when last note is played, not when A button is pressed.


0.14.13

Added ability to change Orba's key by sliding on the OCT pad


0.14.17

Removes ability for looper semitone shift

Add FW field to comms to allow app to turn metronome on / off


0.14.18

Quantization is turned on by default (constant length, snap to 1/16 notes)


0.15.0

This version has quantize on by default

Added 'groove' quantize option


0.15.1

Disables quantization by default to allow releasing of volume per part

md

1 person likes this

I'll go back to plan A, start by working through the flash log and see which one resets quantise. 


1 person likes this

That Flash.bin file appears to be communication/wifi code. 


1 person likes this

Here's the XML for the library definitions in the app code, and a full log from flashing a working Orba from a file.


The Tuning library is the only one that's populated with values; the others look blank. There are some XML tags we haven't seen in the presets such as:


<DevicePreset tuning="Dorian" key="C" />


...from the Preset library.

txt
txt
txt
txt
(494 Bytes)
txt

1 person likes this

I guess we could think of the SeekerData from the Tilt Lead preset as Pitchbend, which I've added here.


image


It follows the same general pattern. It's an effect like Vibrato. This pair have several shared values (63, 29, 76, -128) that set them apart from the others.


1 person likes this

...just realised I was getting confused about this "effect" thing. It seems to be a gesture like the others after all...?


image


I'm not sure how it's supposed to work. Is it a kind of shake...? The notes in Ian's repo say:


<!-- vibrato [pitch wheel] -->


...as if it's a MIDI input or something.


1 person likes this

I copied a sample from above:

MemIdx = 0 - MIDI Note at tick 12, channel 1, note 62, duration 496, von 99, voff 85

MemIdx = 8 - MIDI Note at tick 944, channel 1, note 62, duration 464, von 127, voff 87

MemIdx = 16 - MIDI Note at tick 1908, channel 1, note 62, duration 960, von 121, voff 87

MemIdx = 24 - MIDI Note at tick 3845, channel 1, note 62, duration 996, von 117, voff 80


I can see that 16 is a proprietary message for NoteOn. I suspect the next two values define the start tick since two bytes would be required to define a number greater than 255.


Let's look at the tick number 1908. This requires two bytes which I highlighted below:

image


There is a concept in midi referred to as MSB/LSB (Most Significant Byte / Least Significant Byte). The MSB in the case in binary is a 7 which I saw in often following PlayNote (16). and the LSB is 116. So I suspect that the pattern is


PlayNote, StartTickMSB, StartTickLSB,NoteNumber, VelocityOn, VelocityOff, DurationMSB, DurationLSB


Hopefully I'll get more time this week, but I feel this is very likely what's happening without doing the actual proof.


1 person likes this

I haven't decoded them yet, but here's a glance at the ModifierData for the utility presets. All the Metrics have the same pattern, while the Events add a bit of extra data.


Spin

Radiate

Press

Move

Tilt

Vibrato

Pitchbend

AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAEAAA



Shake CC

AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQgAAAAEAAAAAAAAAAABAAEAAA


Bump

AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACQEAAAAEAAAAAAAAAAABAAEAAA


Shake Note

AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACgEAAAAEAAAAAAAAAAABAAEAAA

 

 

 


1 person likes this

@BJG145 Also I know how long and tedious this is (trial & error, copy/paste, reset device) So THANKS for the hard work. I spent a long time to figure out how the chords worked and if we are going to explore lots of Base64 strings, I might start thinking about a more generic daemon where you can specify the file and the string you want to modify.. In this way you could just make a change and DEPLOY like version 1.. I need to think that out before I commit but that would accelerate the pace of discovery


1 person likes this

As a simple example, here's "Tilt Lead Wider" with a value of 20 for a three-semitone bend when the App settings are at 100% scaling, and "Tilt Lead Snap" which lets you hear the result of -20.


1 person likes this
Login or Signup to post a comment