@@ -61,7 +61,7 @@ pub struct VoiceState {
6161#[ derive( Clone , Debug ) ]
6262pub struct EngineParams {
6363 pub bpm : f32 ,
64- pub scale : & ' static [ i32 ] ,
64+ pub scale : & ' static [ f32 ] ,
6565 pub root_midi : i32 ,
6666 pub detune_cents : f32 ,
6767}
@@ -78,16 +78,21 @@ impl Default for EngineParams {
7878}
7979
8080/// Default five-note scale centered around middle C.
81- pub const C_MAJOR_PENTATONIC : & [ i32 ] = & [ 0 , 2 , 4 , 7 , 9 , 12 ] ;
81+ pub const C_MAJOR_PENTATONIC : & [ f32 ] = & [ 0.0 , 2.0 , 4.0 , 7.0 , 9.0 , 12.0 ] ;
8282
8383/// Diatonic modes (relative semitone degrees)
84- pub const IONIAN : & [ i32 ] = & [ 0 , 2 , 4 , 5 , 7 , 9 , 11 , 12 ] ; // major
85- pub const DORIAN : & [ i32 ] = & [ 0 , 2 , 3 , 5 , 7 , 9 , 10 , 12 ] ;
86- pub const PHRYGIAN : & [ i32 ] = & [ 0 , 1 , 3 , 5 , 7 , 8 , 10 , 12 ] ;
87- pub const LYDIAN : & [ i32 ] = & [ 0 , 2 , 4 , 6 , 7 , 9 , 11 , 12 ] ;
88- pub const MIXOLYDIAN : & [ i32 ] = & [ 0 , 2 , 4 , 5 , 7 , 9 , 10 , 12 ] ;
89- pub const AEOLIAN : & [ i32 ] = & [ 0 , 2 , 3 , 5 , 7 , 8 , 10 , 12 ] ; // natural minor
90- pub const LOCRIAN : & [ i32 ] = & [ 0 , 1 , 3 , 5 , 6 , 8 , 10 , 12 ] ;
84+ pub const IONIAN : & [ f32 ] = & [ 0.0 , 2.0 , 4.0 , 5.0 , 7.0 , 9.0 , 11.0 , 12.0 ] ; // major
85+ pub const DORIAN : & [ f32 ] = & [ 0.0 , 2.0 , 3.0 , 5.0 , 7.0 , 9.0 , 10.0 , 12.0 ] ;
86+ pub const PHRYGIAN : & [ f32 ] = & [ 0.0 , 1.0 , 3.0 , 5.0 , 7.0 , 8.0 , 10.0 , 12.0 ] ;
87+ pub const LYDIAN : & [ f32 ] = & [ 0.0 , 2.0 , 4.0 , 6.0 , 7.0 , 9.0 , 11.0 , 12.0 ] ;
88+ pub const MIXOLYDIAN : & [ f32 ] = & [ 0.0 , 2.0 , 4.0 , 5.0 , 7.0 , 9.0 , 10.0 , 12.0 ] ;
89+ pub const AEOLIAN : & [ f32 ] = & [ 0.0 , 2.0 , 3.0 , 5.0 , 7.0 , 8.0 , 10.0 , 12.0 ] ; // natural minor
90+ pub const LOCRIAN : & [ f32 ] = & [ 0.0 , 1.0 , 3.0 , 5.0 , 6.0 , 8.0 , 10.0 , 12.0 ] ;
91+
92+ /// Alternative tuning systems (pentatonic variants)
93+ pub const TET19_PENTATONIC : & [ f32 ] = & [ 0.0 , 2.4 , 4.8 , 7.2 , 9.6 , 12.0 ] ;
94+ pub const TET24_PENTATONIC : & [ f32 ] = & [ 0.0 , 2.5 , 5.0 , 7.5 , 10.0 , 12.0 ] ;
95+ pub const TET31_PENTATONIC : & [ f32 ] = & [ 0.0 , 2.4 , 4.8 , 7.2 , 9.6 , 12.0 ] ;
9196
9297/// Random generative scheduler producing `NoteEvent`s on an eighth-note grid.
9398///
@@ -223,10 +228,10 @@ impl MusicEngine {
223228 let prob = self . configs [ i] . trigger_probability ;
224229 let rng = & mut self . rngs [ i] ;
225230 if rng. gen :: < f32 > ( ) < prob {
226- let degree = * self . params . scale . choose ( rng) . unwrap_or ( & 0 ) ;
231+ let degree = * self . params . scale . choose ( rng) . unwrap_or ( & 0.0 ) ;
227232 let octave = self . configs [ i] . octave_offset ;
228- let midi = self . params . root_midi + degree + octave * 12 ;
229- let freq = midi_to_hz_with_detune ( midi as f32 , self . params . detune_cents ) ;
233+ let midi = self . params . root_midi as f32 + degree + ( octave * 12 ) as f32 ;
234+ let freq = midi_to_hz_with_detune ( midi, self . params . detune_cents ) ;
230235 let vel = 0.4 + rng. gen :: < f32 > ( ) * 0.6 ;
231236 let dur = self . configs [ i] . base_duration + rng. gen :: < f32 > ( ) * 0.2 ;
232237 out_events. push ( NoteEvent {
0 commit comments