Start a new topic

Orba hacking knowledge base

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


27 people like this idea

The other thing I was wondering is whether it was possible to hack the app in the same way as the XML. It seems to work; I was able to change the text in the Settings window. It might possibly provide a way to control options that are inaccessible from the XML.

image


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


<TuningEntry name="Major" type="tonal" intervals="P1, M2, M3, P4, P5, M6, M7, P8"/>


If you mess with that intervals list in the app code, and load a preset set to a major scale, it changes it.


So...that's at least one thing where we've found no result from changing the XML in the preset, but it has an effect if you change it in the app code.

@Subskybox pointed out a set of tuning entries in the app code.


 <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" />

       -->


Let's take a closer look at this. The entry for the Major scale is:


intervals="P1, M2, M3, P4, P5, M6, M7, P8"


The entry for the Mixolydian scale, which has been commented out, is:


intervals="P1, M2, M3, P4, P5, M6, m7, P8"


Myxolidan is Major with a flattened 7th. This suggests that using "m" instead of "M" (the only difference here) means: "flatten this note". This is confirmed by the entry for the Dorian, which is Major with a flattened 3rd and 7th.


intervals="P1, M2, m3, P4, P5, M6, m7, P8"


Most of the eight-note scales follow the same pattern as the Major:


P1, M2, M3, P4, P5, M6, M7, P8


The sequence is: P M M P P M M P, with 1-8.


I haven't tried to figure out what some of the outliers like "A4" and d5" mean, but they all seem to be implemented. If you substitute the intervals entry for "Major" with the one for "Locrian", then load a Lead preset set to the Major scale, you get a Locrian scale.


If you edit the "Major" entry in the app code, you also have to have "Maj" selected in the App. Occasionally I've had to change it to "Min" then back to "Maj" to make sure it grabs the right setting.


The minor scale that the Orba usually plays is the Natural minor. If you edit the app code, grab the intervals list for eg the Harmonic minor, and use it to substitute the Natural minor entry, then you get the Harmonic minor instead.


So, for example, I currently have my Orba set so that clicking the "Min/Maj" button in the edited version of the App actually switches between Lydian and Phrygian, with working transpose.


It's curious that these "scale presets" are defined in the app, but the usual XML presets don't respond to them. If you simply try to reference one of these alternative scales in a Lead preset it doesn't seem to do anything. I guess it comes down to the fact that the app only has its "Min/Maj" button; you can choose Major or Natural Minor, nothing else. 


It seems Artiphon originally intended to provide a selection of scales, then decided to keep it simple. 


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


I was recently looking at an early interview with Artiphon in Sound On Sound back in 2014.


https://www.soundonsound.com/news/summer-namm-2014-artiphon-instrument-1-video


"I really wanted to discover the pain points in music-making and why most people don’t play music. High learning curves for traditional instruments, not enough time, fear of playing a wrong note... music-making can be intimidating. And yet we’re finding that people feel differently about apps. Hundreds of millions of people are making music with their iPhones and iPads, without worrying about whether they’re musicians or not. Mobile music is growing every day, but you can only do so much with a flat glass screen. Artiphon is designing a multi-instrument interface that’s as flexible and adaptive as the apps it can play. I set out to make an instrument that anyone could start playing and that would grow in complexity as people explore their style."


It explains where they're coming from. They seem to have decided to stick with the "anyone could start playing" idea and forget about the "grow in complexity" bit.


Fair enough. Personally I feel there's a lost opportunity between the appealing hardware and the dumbed-down UI. But I guess they know their market.


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


I mentioned that simply running the app will recreate the Presets folder structure if it's not there. It recreates the Song folder structure as well. So, all that stuff is in the app code; that's the mother lode. The app can spawn presets with various appealing variables, but with some of these it seems you have to go back to the source to make a difference.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Incidentally, changing those entries in the app seems to affect bass, leads and chords. Getting some pretty zany loops out of my Orba now. ;-)


(I'm actually finding this quite a cool way of noodling around on the various scales and getting a feel for them.)

@BJG145 said:

  • "It seems Artiphon originally intended to provide a selection of scales, then decided to keep it simple. "


I absolutely agree, although I think the reason they moved away from this is that it complicated the use of Chords. It seems in the early stages that they were planning on offering lots of scales (that were defined from the .orbapreset files), but as we know, chords are defined as a series of offsets from the notes of the selected scale. So, if the user can choose from a whole bunch of scales, the chords would get messed up. The modiferData string lets the user define two sets of chords so I think they made the app limit selection to only two scales. I originally thought that the last bit of the ModifierData string would let you define a third chord set that would be applied if your voice was Pentatonic. I think I tested that but I can't remember anymore. It might be possible to hack the Maj/Min selection box in the app to include more scales. I find it interesting that they commented out some of the modes (e.g. Dorian, Phrygian) but left a number of minor modes active. I tried Melodic Minor in a Preset but it doesn't work. It only responds to Major[Pentatonic]/Minor[Pentatonic]. The good news is that the Editor allows you to apply all these scales AND keep the Chords intact.


On the intervals, there is a standard notation for intervals that I remember from my school days. A = Augmented and d is Diminished. See here.

On Uuids, I think that unique identifiers have been created to make things easier for development and to speed up data transfer. For example, I think uploading an Artiphon Preset voice with Uuids will upload to the Orba faster than one without (Unproven). I think the App sends the Uuid to the Orba and if it already has a copy of the associated data, then it can skip the transfer. If it doesn't have that reference, it has to transfer the whole body of data. I found that in the Editor, if I didn't delete the Uuids from the new Preset that sometimes the chord/scale changes would not apply.


My next plan of attack is to look more at the other Modifiers/Seekers to see what we might be able to do. I've always been interested in Pitchbend so that might be a starting point. I've hooked up an external MIDI keyboard and the Orba to my laptop in the past and was able to play the Orba via the keyboard. It didn't respond to the Pitchbend wheel (at least for the voices I tried it with). I was disappointed.


Recently, I found this video I hadn't seen before:

https://www.youtube.com/watch?v=yoxUlNmhQWw


This goes over the Gestures at the start and I do believe it is in some ways false advertising. The Slide gesture as a 'Singing Bowl' could be possible but not without hacking and Spin to control Pitch is also not possible. Perhaps with some hacking it could be. I've imagined adding Tilt to a voice to control pitch (not sure if even possible). The idea is that you could get many more notes in a scale knowing that tilting the Orba to its side would flatten all the notes a semitone. Later in this video, they show arpeggios. I do believe that maybe these had been planned for in the past and that this is what the <PatternList> and <PatternEntry> nodes were for. I haven't messed around with these.


@BJG145 Congrats on the App edits. It would be great if you could find the default quantization setting and flip it back on. Even if its buggy, it would be cool to try.

I found a Preset somewhere called Tilt Lead. Tilt Lead will Pitch bend on the Tilt gesture. I can confirm Orba is emitting Pitch bend midi messages when you Tilt it.


Uuid 53b7e156e0364f45b2a78652c299ba19 is for Tilt


You can modify the experimental Fiddler by changing the Base64 string at line 502 to the SeekerData for this Preset's corresponding SeekerEntry/SeekerData: "ASMAAAEAgBQADwAAAQEAAEwdAAD/fwAg/z8ABA=="


The Fiddler will reveal a value of 2 in index 9. I immediately thought I hit the jackpot and that this would control the 2 semitones observed from the Tilt Lead Preset. I was wrong. Instead, it seems that a value of 2 enables this behavior while any other number turns it off. (I only tried a few).

It will take some time to to go through these and see if they do anything. I still think that these values are somehow pointers to memory locations where the corresponding ModifierData gets applied but not sure yet.

Most MIDI keyboards I've played with have a global setting for Pitchbend Range so I wonder if this range might be defined in the App and not in the Preset itself? Some more work needs to happen here for sure..


Once we figure out how the Pitchbend is connected, I'd like to see if it can be mapped to another gesture. I'm curious if it can only bend up. After an hour of messing with values.. no luck

>I've hooked up an external MIDI keyboard and the Orba to my laptop in the past and was able to play the Orba via the keyboard. It didn't respond to the Pitchbend wheel (at least for the voices I tried it with).

 

I haven't tried this before, but I just connected up a MIDI keyboard with the 1981 patch and pitchbend works OK; it bends over several octaves. There's a "Pitchbend Scaling" setting in the App but it didn't seem to make any difference.

(Note and pitchbend input from the keyboard isn't recorded. Once you've recorded a sequence, you can continue to apply pitchbend to the playback, and it affects the currently selected track; bass/lead/chords. It doesn't affect drums.)

I found a Preset somewhere called Tilt Lead. Tilt Lead will Pitch bend on the Tilt gesture. I can confirm Orba is emitting Pitch bend midi messages when you Tilt it.

Tilt Lead is very neat; I'd overlooked it. So, not just just MIDI; it bends the internal synth. Will have to examine the code for that more closely.

Looking at Tilt Lead then, it has a synth patch tied to it, but you can grab the Modifier/Seeker list and swap that into any other Lead preset to add tilt-pitchbend. I guess the next thing is to narrow it down to a particular Modifier/Seeker entry.


Incidentally I was surprised to see that this preset has:


<SoundPreset>

   <SynthPatch>

   </SynthPatch>

</SoundPreset>


...whereas all the other lead presets just have 


<SoundPreset>

   <SynthPatch>

</SoundPreset>


I guess closing the outer set implicitly closes the inner one.

The final Modifer/Seeker entry in the Tilt Lead preset is the one that adds tilt-pitchbend. If you add that to the list in one of the other Lead presets, it adds that functionality.


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


I think the App sends the Uuid to the Orba and if it already has a copy of the associated data, then it can skip the transfer. If it doesn't have that reference, it has to transfer the whole body of data.


I think you might be right about this. After adding tilt to the list of Modifier/Seeker pairs in one of the other presets, I tried deleting all the Modifier entries and it still worked. But when I edited the Uuids it crashed. However, if I edited the Uuids in the same way throughout the Modifier/Seeker list, it still worked.

(I only tried this experiment once so I may be mistaken.) 

...this is just a general thought, but, we know what the "ModifierData" does; it modifies/changes the output, with chords at least, and possibly with other things. There aren't many differences in the ModifierData strings in the Lead presets, but there are some. Eg the data for the first four Modifier entries in Tilt Leads begin with:


AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQgAAAAE

AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAE

AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAE

AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACQEAAAAE


That variation in the fourth one isn't defiining chords presumably, so, what is it doing...? If we match up the gestureUUIDs with the list in Ian's repo (compiled from Artiphon's Utility presets), it looks like that's Bump.


I tend to think of the Modifier/Seeker lists as representing Output and Input respectively. Perhaps the idea of a "Seeker" is to seek/process input data...? Eg this might be the varying angle for the "Tilt" preset, or the different pads for the "Tap" preset etc. I'm trying to imagine what the seekerData represents. Unlike the ModifierData strings for Tilt Lead, the SeekerData strings are all very different.

...just to add @Subskybox's comment from the Utilities thread to this for reference...


My thinking is that there are some characters in the Seekers that are pointers into Orba memory. It applies the ModifierData bytes to the location pointed at by the corresponding Seeker. (This is my theory so far).

  

Login or Signup to post a comment