@subskybox - when you made the Clarinet preset how did you determine the loop values? I now understand the concept of frames a bit and am comfortable about finding a value to avoid the first attack of the sound but I wonder if there is anything I need to know to get a clean sounding loop and set an appropriate end point?
I have it mind to make a set (or two) of flute sounds if I can.
Ah, I've just tried that last attempt I mentioned above. The result works (with lots of pairs of the same notes in the chordLists - it's not quite what I'd hoped but it works (hurray!) and sounds rather nice, but in a different way intended. (There were some compromises to avoid failure.)
My first attempt though sounded very different in the minor. I tried changing the audioEngineMinor parameter in the compatibility section in SynthPatch to match the major sound parameter and hey presto it worked - making them sound the same in tone. (I had not previously expected these parameters to do something like that.)
I will wait a bit and test this out a bit more - just to see if it behaves itself. If it stays good I will post it on the appropriate thread.
Yes, I had been trying to make a chord preset which would emulate a mountain dulcimer which has two drone strings and two strings in unison for melodies and is fretted for a diatonic scale. My attempts failed and I had thought this was either because I had settings for two notes the same or because the overall (or perhaps partial) range was over some limit (possibly two octaves). I discounted the first option, except that it seemed to result in the monophonic effect sometimes.
I noted that some of the factory presets set two notes the same - so maybe you can get away with two notes set the same , but with three or more you get the error? The range issue I put down to a protection against having a setting that would try and play notes outside the range the Orba can handle.
I have one last idea to try and get what I was trying to achieve but if that fails I will abandon the plan.
I reported the chords as a second lead preset effect because I felt it could be useful and fairly straightforward to implement.
BJG145 noted a similar sort of thing that made the lead behave like a chord preset. I confess I wasn't sure about that - it seemed unlikely to me that the seeker entry would do that. But I haven't experimented with it - it didn't seem to me to have an advantage to it.
While I was working on the tool above, I wanted people to have a way to make custom scales. I did this by setting all the offsets for each pad to the same number. For example:
<ChordModifierParams majorChordList="0, 0, 0, 0; 0, 0, 0, 0; 0, 0, 0, 0; 0, 0, 0, 0; 0, 0, 0, 0; 0, 0, 0, 0; 0, 0, 0, 0; 0, 0, 0, 0; " minorChordList="..."/>
..And in this case (for C Major) it would produce:
C,C,C,C [0,0,0,0]
D,D,D,D [0,0,0,0]
E,E,E,E [0,0,0,0]
F,F,F,F [0,0,0,0]
G,G,G,G [0,0,0,0]
A,A,A,A [0,0,0,0]
B,B,B,B [0,0,0,0]
C,C,C,C [0,0,0,0]
Orba will not allow to play the same MIDI note twice so you basically get one note. This can be used to make any scale you want or even shift by half octaves. What I found out after a while as that by doing this that it is still monophonic. It was the presence of the ModifierChain that forced it to monophonic. You can drop a Lead voice into the Chord folder and it will work.
There were two more bytes that I had to modify to make a Bass or Lead pickup the Modifier Chain and they had to do with the first Seeker (a.k.a. SeekerType="Note")
Just an observation from my experiments with chord presets:
If you remove the chord offset lists by removing the the whole ModifierEntry section (being careful not to break the xml formatting) you get what is effectively another lead voice - with polyphonic capability, but without gestures (although I suspect it might be possible to add that).
The preset seems to work in songs OK, so could be useful for some songs where the chord presets are too limiting, although it keeps you down to notes in one octave. If using a SynthPatch section from a lead you may want to lower the volume in the patch for the best effect.
@DavidBenton
"It could also be possible (but a bit mind bending to do) to create a a preset with only 3 or 4 chords but with different voicings for them (first inversions, or added 7ths, for example) - which would be great for harmonically simple songs."
BTW, I made a tool to make Orba Chords for Orba 1 but is still very useful for Orba 2 to work out the offsets. https://github.com/subskybox/Orba. Scroll to the bottom of that page and watch the 2 minute Demo movie.
@Subskybox - Thanks for that but actually I had a decent grounding in musical theory - it's just that it had many years of neglect, rust and been mistreated since. Plus the electronic era has a rather different ways and means than I'm used to.
@DavidBenton Do you know that the [major | minor]ChordLists are just offsets (in semitones) from the root note of each pad?
<ChordModifierParams majorChordList="0, 7, 12, 16; 0, 7, 12, 15; 0, 7, 12, 15; 0, 4, 7, 16; 0, 4, 7, 12; 0, 3, 7, 12; 0, 3, 12, -4; 0, 4, 12, -5; " minorChordList="0, 3, 7, 0; 0, 3, 8, 0; 0, 4, 7, 0; 0, 3, 7, 0; 0, 3, 7, 0; 0, 4, 7, 0; 0, 4, 7, 0; 0, 3, 7, 0; "/>
If you are in C Major [C,D,E,F,G,A,B,C], the chords would be:
C,G,C,E [0,7,12,16]
D,A,D,F [0,7,12,15]
E,B,E,G [0,7,12,15]
F,A,C,A [0,4,7,16]
G,B,D,G [0,4,7,12]
A,C,E,A [0,3,7,12]
B,D,B,G [0,3,12,-4]
C,E,C,G [0,4,12,-5]
The root notes for the Minor mode are Natural Minor so [C,D,Eb,F,G,Ab,Bb,C]
Yes that's right! I created all kinds of custom chords for Orba 1. It was much harder then because it was all encoded in Base64! Now they've made it human readable. You can create any chords you want even mix modes. Diminished chords, 6/9 chords.. only limited to 4 notes per chord.
By the way it has occurred to me that you can do some interesting things (but of limited use!) with the chord settings. For example, by shifting down by one all offset values for the key 7 you can get a chord on the flattened 7th of the major scale (it works, I've done it) - probably more useful than one on the major 7th. It could also be possible (but a bit mind bending to do) to create a a preset with only 3 or 4 chords but with different voicings for them (first inversions, or added 7ths, for example) - which would be great for harmonically simple songs.
The correspondence you make with the EventCurveAssignmentsEntry makes sense if you think of it as a provision for a range of different controllers (defined by the JUCE engine and/or the MPE midi standards?) The Orba (and perhaps the Roli keyboards, for example) would use the MoveX, Y and Z parameters whereas others might only use the general Move parameter. Some of the others might not be used by the Orba as well - but intended for other controllers.
As far as the bezier curves go, I would only want to go as far as swapping out known entries to get close to the behaviour that would work best for each preset. But understanding how they work and what they do is important to understand how to use them.
Here is my report-out for all the Bezier Sets I found (7 unique sets) in all the Factory Presets:
Summary:
For the 14 values (EventCurveAssignmentsEntry) I was thinking they might correspond to some of these (which I found in the code):
Bump, Lift, Move, MoveX, MoveY, MoveZ, Palm, Press, Radiate, Shake, Slide, Spin, Tap, Tilt, Vibrato
I agree not to get fixated on the numbers 47 and 12. I'm assuming they are some type of mappings for now but could be completely wrong.
As for the Bezier curves, I'm 99% sure that I am correct with my interpretation. The Base64 string converts to exactly 256 bytes (8*4*8 = 256). That is 8 Points per Bezier curve * 4 bytes per Point (float32 value) * 8 Bezier curves.
The first 32 bytes are:
00 00 00 00 00 00 00 00 71 f4 28 46 71 f4 28 46 71 f4 a8 46 71 f4 a8 46 00 fe ff 46 00 fe ff 46
Point 1 = (0,0)
Point 2 = (10813.1103515625,10813.1103515625)
Point 3 = (21626.220703125,21626.220703125)
Point 4 = (32767,32767 )
The float numbers are stored using the Float (IEEE754 Single precision 32-bit) standard and in reverse order (Little Endian). So for example, Point 4 X/Y are stored with the 4 bytes 00 fe ff 46 so if you reverse these you get 0x46fffe00 and this is 3.2767e4 as seen here:
https://www.binaryconvert.com/result_float.html?hexadecimal=46FFFE00
Hope that helps. There's no need to worry about the math or conversions. I've written a utility that decodes Base64, shows the curves, allows you to edit the curves and then copy back the new Base64 string. I'll share it to my GitHub site soon.
Oh dear - 14 is exactly twice 7 isn't it. Significant?
My first thought when I saw that number of 14 parameters was does that tie up to the groups of parameters in the SynthPatch mod groups - but there's only 4X3 of them - but if they did relate then it could be down to formatting required by the Juce engine or 2 of the 14 are required but not used by the Orba. I mention that because we could fall foul of trying to match numbers when they perhaps don't - because the Orba doesn't use all the things the engine can.
That said your observation about the BezierCurvesEntry is compatible with what I experienced with the few attempts I tried.
Looking at the bezierCurvesData string in hex in groups of four bytes it looks like 7 entries each starting with 8 bytes of zero and then 48 bytes . There's also a lot of the group values the same. Don't know what that might mean though. (And so - to my bed.)
Subskybox
This forum is intended to share Orba 2 hacking tips amongst the Orba 2 community. NOTE: Please post facts that are well understood & useful. If you have theories to discuss, please start another forum and link to it here.
2 people like this idea