Development Group: class library / sclang

I am not sure if I can be woken up at the meeting time.
(2:00 am in my geographical location)

In the hope of seeing you at the meeting, or in the hope that my ideas will be mentioned by those attending the meeting, I would like to propose the following two things:

All the systems I have made support 48 EDO for the Lilypond-style pitch naming convention (note: the octave numbers follow the scientific pitch notation) and 96 EDO for their own pitch naming style. My SPN and PitchClassSet seem to be ready to use, but Notator needs more work. I will test it more this year.

While writing the code below, I extended my thought to make a DynamicMark class to get amplitude and dBFS from dynamic markings. I think this will make it easier for beginners to get started with algorithmic composition:

(
	s.waitForBoot {
		var dynamic, pitch, rhythm, legato;
		dynamic = { 
			var dynamics = (
				ffff: 104, fff: 94, ff: 84, f: 74, mf: 64, 
				mp: 54, p: 44, pp: 34, ppp: 24, pppp: 14, 
				sf: 90
			);
			dynamics[dynamics.keys.asArray
				.wchoose(([1, 2, 3, 4, 5].mirror2 ++ [4]).normalizeSum)
			]
		};
		pitch = {
			var pitchClass, alteration, octave;
			pitchClass = [\a, \b, \c, \d, \e, \f, \g].choose;
			//21.midispn; //108.midispn;
			alteration = [\s, \n, \f].choose;
			//octave = (0..8).wchoose((1, 3 .. 9).mirror.normalizeSum);
			octave = (2..6).wchoose((1, 3 .. 5).mirror.normalizeSum);
			(pitchClass ++ alteration ++ octave).asSymbol;
		};
		rhythm = {
			2.pow((0..4)).reciprocal.wchoose([1, 3, 5].mirror.normalizeSum)
		};
		legato = { [1.01, 0.9, 0.5, 0.2].choose };
		
		100.do { |index|
			var thisPitch, thisPitchMIDI, thisDuration, thisLegato, thisDynamic, dynamicChange,durationChange;
			thisPitch = ({ pitch.() }!(1..4).wchoose([2, 1, 1, 1].normalizeSum))
			.asSet.asArray.sort;
			thisPitchMIDI = thisPitch.collect { |item| item.midi };
			thisDuration = rhythm.();
			thisLegato = legato.();	
			thisDynamic = dynamic.() / 127;
			dynamicChange = 1.rand2;
			durationChange = 1.rand2;
			(1..5).wchoose([5, 1, 1, 1, 1].normalizeSum).do { |repetitionIndex|
				var thisPitchChange, thisDynamicChange, thisDurationChange;
				thisPitchChange = (-0.03, -0.02 .. 0.03).choose;
				thisDynamicChange = (-15, -14.5 .. -12).choose.dbamp * (dynamicChange * repetitionIndex * 3).dbamp;
				thisDurationChange = (durationChange * repetitionIndex / 64);
				(index.asString ++ "-" ++ repetitionIndex).postln;
				(
					instrument: \default,
					amp: thisDynamic * thisDynamicChange,
					midinote: thisPitchMIDI + thisPitchChange,
					dur: thisDuration + thisDurationChange,
					legato: thisLegato
				).play;
				(thisDuration + thisDurationChange).wait
			}
		}
	}
)

@semiquaver The idea of the function pitch above is related to your following idea in other post:

With the current SPN:

[\a, \c, \e,].collect { |item| (item ++ 4 ++ \e).asSymbol }
// even though rhythm is not here.

[\a, \c, \e].collect{ |item| (item ++ 4.rrand(6)).asSymbol }