@@ -58,15 +58,20 @@ fn main() {
5858 match cli. command {
5959 Command :: Button => {
6060 let mut button = Button :: new ( cli. title . as_deref ( ) ) . unwrap ( ) ;
61+ let mut prev_pressed = false ;
6162 loop {
6263 button. tick ( ) . unwrap ( ) ;
63- let key = Note :: default ( ) . to_midi_index ( ) . into ( ) ;
64- let message = if button. pressed ( ) {
65- MidiMessage :: NoteOn { key, vel : 0 . into ( ) }
66- } else {
67- MidiMessage :: NoteOff { key, vel : 0 . into ( ) }
68- } ;
69- client. send ( MidiEvent { channel, message } ) . unwrap ( ) ;
64+ let pressed = button. pressed ( ) ;
65+ if pressed != prev_pressed {
66+ let key = Note :: default ( ) . to_midi_index ( ) . into ( ) ;
67+ let message = if button. pressed ( ) {
68+ MidiMessage :: NoteOn { key, vel : 0 . into ( ) }
69+ } else {
70+ MidiMessage :: NoteOff { key, vel : 0 . into ( ) }
71+ } ;
72+ client. send ( MidiEvent { channel, message } ) . unwrap ( ) ;
73+ prev_pressed = pressed;
74+ }
7075 }
7176 }
7277 Command :: Knob {
@@ -110,27 +115,42 @@ fn main() {
110115 y : axis_label_y,
111116 } ;
112117 let mut xy = Xy :: new ( cli. title . as_deref ( ) , axis_labels) . unwrap ( ) ;
113- loop {
114- xy. tick ( ) . unwrap ( ) ;
115- let ( x, y) = xy. value_midi ( ) ;
118+ let send_x = |value| {
116119 client
117120 . send ( MidiEvent {
118121 channel,
119122 message : MidiMessage :: Controller {
120123 controller : controller_x. into ( ) ,
121- value : x ,
124+ value,
122125 } ,
123126 } )
124127 . unwrap ( ) ;
128+ } ;
129+ let send_y = |value| {
125130 client
126131 . send ( MidiEvent {
127132 channel,
128133 message : MidiMessage :: Controller {
129134 controller : controller_y. into ( ) ,
130- value : y ,
135+ value,
131136 } ,
132137 } )
133138 . unwrap ( ) ;
139+ } ;
140+ let ( mut prev_x, mut prev_y) = xy. value_midi ( ) ;
141+ send_x ( prev_x) ;
142+ send_y ( prev_y) ;
143+ loop {
144+ xy. tick ( ) . unwrap ( ) ;
145+ let ( x, y) = xy. value_midi ( ) ;
146+ if x != prev_x {
147+ send_x ( x) ;
148+ prev_x = x;
149+ }
150+ if y != prev_y {
151+ send_y ( y) ;
152+ prev_y = y;
153+ }
134154 }
135155 }
136156 Command :: ComputerKeyboard { start_note } => {
0 commit comments