With scale mode active, is it possible to transpose up/down by N scale degrees instead of by N semitones?
It works for the global transpose track, but id like to see the ability to work entirely in scale degrees through midi effects, such as harmonise/arpeggiate, etc. Currently it writes the pattern notes in semitones, then effects the note numbers, then re-quantises the new numbers to scale. I find issues where im changing modes, keys, chords, etc, mid way through note applications. Chord degrees can shift unexpectedly eg a 1,4,5 chord in one mode can become a 1,3,5 chord in another mode. “Stick up/down” generally helps, but therell be situations where some notes you want to stick up, and some youll want to stick down.
Ive requested more scale degree options in multiple sequencer dev teams. Also ability to include accidental shifts, where you temporarily change from say a minor to major chord.
Disclaimer: I do not own yet a Hapax, but I write sequencer applications in various frameworks, so I have given this problem some thought.
What you describe is an inherent limitation of the MIDI music system (or whatever music system calls notes by their frequency [Hz] value). When you call notes this way, and you are e.g. in a diatonic scale, hopping 1 degree sometimes is a jump of 1 semitone, sometimes is a jump of 2 semitones. There is no “safe” scale-aware transpose, because you already lost some information in the first place (is note 37 a C#, or Db, or B##, or something else? Those notes have different pitch classes, but same frequency, in music theory are called enharmonic equivalents).
Only by representing notes by their pitch class (A, B, C, D, E, F, G) plus accidentals (none, b, #, bb, ##, etc…) [plus octave] you can do correct “harmony math”.
So I’d guess it would require a radical change to be able to write music like that (pitch class + octave + accidentals) in a step sequencer like the Hapax, because not only you need to be able to input accidentals of a note, but it requires to internally store the music with different data than MIDI note numbers and that would be incompatible with Hapax storage format which relies on plain MIDI notes.
Yeh that’s true, I am a programmer on the side, so I’m aware of the issue. That said, it doesn’t require much more memory or processing. Just requires that you maintain the data while you’re working on it.
The way I do it in max/msp is just to store a degree number, an octave number, and then have a kind of dictionary or array of paired values -
“scale degree” on one side of the pair list/dictionary, then “semitone offset from root” on the other side of the pair/dictionary list.
e.g.:
Major scale is:
Scale degree 0: semitones from root 0, scale degree 1: semitones from root 2, scale degree 2: semitones from root 4, scale degree 3: semitones from root 5, scale degree 4: semitones from root 7, scale degree 5: semitones from root 9, scale degree 6: semitones from root 11,
More easily written as an array with “number of degrees in scale” elements, and the values of those elements being the semitone offset from degree 0. Again for Major scale
[0] = 0
[1] = 2
[2] = 4
[3] = 5
[4] = 7
[5] = 9
[6] = 11
so using the C Key, the Major scale, and midi note number 60 (middle C) you have the following data:
degree = 0
octave = 5 (note number/12 (rounded down integer calculation/ignoring remainders)
When doing things like transposition effects, I use base 8, so that the least significant digit represents the degree, and any other significant digits represent octaves.
eg
octave 2, scale degree 6 transposed + (transposed) 4 scale degrees is
26(base 8) + 04(base 8) = 32(base 8) or octave 3, degree 2 (which is why counting degree numbers from 0 makes more sense than from 1)
Converting back to midi note number is just octave * 12 + scale degree:semitone offset dictionary value.
eg octave 3, scale 2 would be
3*12 + scale[degree 2] which is 5
The main thing is you need a way to say like “ok now im working in scale degree mode” or “ok now I want to work in semitone mode”
For example, in a midi effect chain, you might want an intermediate effect to put between two others, that allows you to shift from scale degrees for the first few effects, then semitones for a few effects, then back again, or vice versa.
I haven’t worked on the accidental side of things yet, so don’t have a method for integrating that nicely, but there should be a reasonable way to include it. The main reason I want accidentals, is because a lot of interest arises in music when you start to do things like replace a diatonic major chord with a minor chord, or so on.
In traditional music theory scales work like so: consider the music scoring system used practically everywhere: there are a few alterations on the staff (say: Eb, Ab, Bb, meaning that all future occurrences of E, A, B will be lowered by 1 semitone) and that’s enough to get your minor scale (then a phrase C D E F G A B C according to those example alterations, plays the C natural minor scale).
But it is substantially the same: there are seven pitch classes (the seven degrees of the scale) that repeat across octaves…
I think one should distinguish two conceptual levels.
There is the harmony level (a higher level, conceptually), in which you write music as pitch class+octave+accidentals.
The output of that level is transformed into note frequencies, or MIDI note number which is the same, by: midi = 12*octave+pitchClassSemitones+accidentals where pitchClassSemitones is 0 for C, 2 for D, 4 for E, 5 for F, etc… accidentals is 0 if none, -1 for b, +1 for #, +2 for ##, etc…
You could have plugins that transform harmony data (so transposing in scale degrees) that operate before that transformation to MIDI, and plugins that work in frequency values or MIDI note numbers (so transposing by semitones).
(but you could also transpose everything up by a semitone by adding a # accidental to all notes in a given phrase…)
I immediately think also about accidentals, because without those, you are forced to have everything in scale, which can be quite boring.
With accidentals you can have passing tones, modulations, borrowed chords, or simply more “coloured” chord extensions.
In my view, scales and chords should be a guideline, not an unbreakable rule.