sounds/just_intonation

just_intonation

dz / sounds / just_intonation

Summary

Experiments with Just Intonation

Node Tree

Nodes

motivations
content motivations for JI
children ringing_chords, vox_blending

vox_blending
content My hopes for working with JI is in the context of vocal synthesis. I was inspired by a video I saw of the vocal ensemble Graindelavoix perform Gesualdo. Their blending was amazing, and I thought it might have something to do with their intonation. Since fretless ensembles tune chords to ring, I figured it was the natural inclination for the intonation scheme to be more just intonation than equal temperament
children graindelavoix_gesualdo (inspiration for thinking about JI)
parents motivations

graindelavoix_gesualdo
content Carlo Gesualdo, Plange Quasi Virgo (Tenebrae Responsoria), GRAINDELAVOIX
parents vox_blending
hyperlink https://www.youtube.com/watch?v=IfOQICfimJE

algorithm
content A Just Intonation algorithm for converting MIDI notes into JI frequencies.
children base_and_multiplier, diatonic_only, implementation (C implementation on sourcehut), interpolation, stretchy_intonation_ensembles

implementation
content JI implementation (sndkit/mnolth node via mnodes)
children inputs, sound_examples
parents algorithm
hyperlink https://git.sr.ht/~pbatch/mnodes/tree/master/item/ji/ji.c

inputs
content Inputs: a MIDI note number, and a key (0-11)
children stretchy_intonation_ensembles (continously controlled fractional inputs for stretchiness)
parents implementation

diatonic_only
content Strictly speaking, there is no such thing as a non-diatonic note in this system. The only actual pitches available are 7 scale degrees available in the current base key. Non-diatonic pitches are considered in-between two diatonic pitches, and interpolation is used to compute those frequencies.
parents algorithm

stretchy_intonation_ensembles
content By having continuous control of key and pitch, the idea was that a lyrically performed sound such as the voice could have a degree of stretchiness in the pitches. This would allow an ensemble of voices to perform ringing chords in multiple keys
children interpolation
parents algorithm, inputs, ringing_chords

ringing_chords
content Ringing Chords
children stretchy_intonation_ensembles (stretch to ring chords in multiple keys)
parents motivations

sound_examples
content Sound Examples
children saws_et_ji, vox_et_ji
parents implementation

saws_et_ji
content A subtractive sawtooth patch, first performing in equal temperament, then in just intonation. In the ET patch there is beating, while with JI the pitches are dead on. The difference in sound is not subtle.
children vox_et_ji (iteration: from saws to vocal synthesizers)
parents sound_examples
audio

vox_et_ji
content A synthesized vocal ensemble playing a diatonic cluster chord, first using equal temperament, then using Just Intonation. In the ET version, there is that warbly beating sound which would be quite difficult and unnatural for a human vocal ensemble to perform. To my ears, they turn into sawtooth oscillators after a while. In the JI version, the voices blend much better. The sound is a little metallic, but I still think it's a step in the right direction. I'm hoping I'll be able to sand down some of the rough edges here.
children metallic_explanation (Metallic ringing explanation)
parents saws_et_ji, sound_examples
audio

metallic_explanation
content I think the reason why there is a metallic quality to the voices has to do with the fact that the voices were basically copy-pasted from one another. Other than pitch, the voices are virtually identical to one another right down to the phase alignment.
parents vox_et_ji

base_and_multiplier
content Just intonation boils down two a multiplication between a base frequency (in this case, determined from the input midi pitch and key and calculated using equal temperament), multiplied by a just intonation ratio.
children base_frequency_includes_octave, diatonic_mapping, ratios
parents algorithm

ratios
content Just Intonation Ratios: [1:1 (do), 9:8 (re), 5:4 (mi), 4:3 (fa), 3:2 (so), 5:3 (la), 15:8, 2:1 (do)]
children octave_wrapping (The last element of the ratios is 2 for the next octave)
parents base_and_multiplier

dialut
content Map 12 semitones to 7 fractional diatonic tones: [0, 0.5, 1, 1.5, 2, 3, 3.5, 4, 4.5, 5, 5.5, 6, 7]. Note how there are larger jumps between 2 + 3 (mi and fa), and 6 and 7 (ti and do). These are where the halfsteps are in the major diatonic scale
children octave_wrapping
parents diatonic_mapping

diatonic_mapping
content The input is still coming in as a MIDI note number in semitones, converted to a scale degree relative to the base note that is in range 0-11. In order to have it work with a JI ratio lookup table with interpolation, it needs to be converted to a fractional value between 0 and 7. Computing the multiplier from a semitone value
children dialut
parents base_and_multiplier

base_frequency_includes_octave
content The MIDI note number contains information about which octave the pitch is at, and this is used to compute the base frequency
parents base_and_multiplier

octave_wrapping
content Due to the interpolation logic, the algorithm needs to be able to wrap to above the octave. This is done by extending the lookup tables to include the second octave.
parents dialut, interpolation, ratios

interpolation
content linear interpolation is used to compute the frequency which allows notes to smoothly glide from one to another.
children octave_wrapping (Octave wrapping)
parents stretchy_intonation_ensembles, algorithm