11use crate :: core:: MusicEngine ;
22use crate :: core:: { AEOLIAN , DORIAN , IONIAN , LOCRIAN , LYDIAN , MIXOLYDIAN , PHRYGIAN } ;
3+ use crate :: overlay;
34use std:: cell:: RefCell ;
45use std:: rc:: Rc ;
56use wasm_bindgen:: JsCast ;
67use web_sys as web;
78
9+ /// Get the name of the current scale for display purposes
10+ fn get_scale_name ( scale : & [ i32 ] ) -> & ' static str {
11+ match scale {
12+ s if s == IONIAN => "Ionian (major)" ,
13+ s if s == DORIAN => "Dorian" ,
14+ s if s == PHRYGIAN => "Phrygian" ,
15+ s if s == LYDIAN => "Lydian" ,
16+ s if s == MIXOLYDIAN => "Mixolydian" ,
17+ s if s == AEOLIAN => "Aeolian (minor)" ,
18+ s if s == LOCRIAN => "Locrian" ,
19+ _ => "Custom" ,
20+ }
21+ }
22+
23+ /// Update the hint overlay after engine parameter changes
24+ fn update_hint_after_change ( engine : & Rc < RefCell < MusicEngine > > ) {
25+ if let Some ( window) = web:: window ( ) {
26+ if let Some ( document) = window. document ( ) {
27+ let ( detune, bpm, scale_name) = {
28+ let eng = engine. borrow ( ) ;
29+ (
30+ eng. params . detune_cents ,
31+ eng. params . bpm ,
32+ get_scale_name ( eng. params . scale ) ,
33+ )
34+ } ;
35+ overlay:: update_hint ( & document, detune, bpm, scale_name) ;
36+ overlay:: show_hint ( & document) ;
37+ }
38+ }
39+ }
40+
841#[ inline]
942pub fn root_midi_for_key ( key : & str ) -> Option < i32 > {
1043 match key {
@@ -43,10 +76,12 @@ pub fn handle_global_keydown(
4376 let key = ev. key ( ) ;
4477 if let Some ( midi) = root_midi_for_key ( & key) {
4578 engine. borrow_mut ( ) . params . root_midi = midi;
79+ update_hint_after_change ( engine) ;
4680 return ;
4781 }
4882 if let Some ( scale) = mode_scale_for_digit ( & key) {
4983 engine. borrow_mut ( ) . params . scale = scale;
84+ update_hint_after_change ( engine) ;
5085 return ;
5186 }
5287 match key. as_str ( ) {
@@ -56,6 +91,7 @@ pub fn handle_global_keydown(
5691 for i in 0 ..voice_len {
5792 eng. reseed_voice ( i, None ) ;
5893 }
94+ log:: info!( "[keys] reseeded all voices" ) ;
5995 }
6096 "t" | "T" => {
6197 let roots: [ i32 ; 7 ] = [ 60 , 62 , 64 , 65 , 67 , 69 , 71 ] ; // C, D, E, F, G, A, B
@@ -67,21 +103,54 @@ pub fn handle_global_keydown(
67103 let mut eng = engine. borrow_mut ( ) ;
68104 eng. params . root_midi = roots[ ri] ;
69105 eng. params . scale = modes[ mi] ;
106+ drop ( eng) ;
107+ update_hint_after_change ( engine) ;
70108 }
71109 " " => {
72110 let mut p = paused. borrow_mut ( ) ;
73111 * p = !* p;
112+ log:: info!( "[keys] paused={}" , * p) ;
74113 ev. prevent_default ( ) ;
75114 }
76115 "ArrowRight" | "+" | "=" => {
77116 let mut eng = engine. borrow_mut ( ) ;
78117 let new_bpm = ( eng. params . bpm + 5.0 ) . min ( 240.0 ) ;
79118 eng. set_bpm ( new_bpm) ;
119+ drop ( eng) ;
120+ update_hint_after_change ( engine) ;
80121 }
81122 "ArrowLeft" | "-" | "_" => {
82123 let mut eng = engine. borrow_mut ( ) ;
83124 let new_bpm = ( eng. params . bpm - 5.0 ) . max ( 40.0 ) ;
84125 eng. set_bpm ( new_bpm) ;
126+ drop ( eng) ;
127+ update_hint_after_change ( engine) ;
128+ }
129+ "," => {
130+ let mut eng = engine. borrow_mut ( ) ;
131+ if ev. shift_key ( ) {
132+ eng. adjust_detune_cents ( -10.0 ) ; // Fine adjustment
133+ } else {
134+ eng. adjust_detune_cents ( -50.0 ) ; // Coarse adjustment
135+ }
136+ drop ( eng) ;
137+ update_hint_after_change ( engine) ;
138+ }
139+ "." => {
140+ let mut eng = engine. borrow_mut ( ) ;
141+ if ev. shift_key ( ) {
142+ eng. adjust_detune_cents ( 10.0 ) ; // Fine adjustment
143+ } else {
144+ eng. adjust_detune_cents ( 50.0 ) ; // Coarse adjustment
145+ }
146+ drop ( eng) ;
147+ update_hint_after_change ( engine) ;
148+ }
149+ "/" => {
150+ let mut eng = engine. borrow_mut ( ) ;
151+ eng. reset_detune ( ) ;
152+ drop ( eng) ;
153+ update_hint_after_change ( engine) ;
85154 }
86155 "Enter" => {
87156 if let Some ( win) = web:: window ( ) {
0 commit comments