@@ -3,46 +3,49 @@ use crate::{
33 server:: MidiChannelUdp ,
44 widget:: { ByTitle , Widget } ,
55} ;
6- use caw_core:: { Buf , Sig , SigShared , SigT } ;
7- use caw_keyboard:: Note ;
8- use caw_midi:: MidiMessages ;
6+ use caw_core:: { Sig , SigShared , SigT } ;
7+ use caw_keyboard:: { KeyEvents , Note } ;
8+ use caw_midi:: MidiMessagesT ;
99use lazy_static:: lazy_static;
1010
11- pub struct ComputerKeyboard {
12- sig : Sig < MidiChannelUdp > ,
11+ lazy_static ! {
12+ static ref BY_TITLE : ByTitle <Sig <SigShared <MidiChannelUdp >>> =
13+ Default :: default ( ) ;
1314}
1415
15- lazy_static ! {
16- static ref BY_TITLE : ByTitle <ComputerKeyboard > = Default :: default ( ) ;
16+ fn new_computer_keyboard (
17+ title : String ,
18+ start_note : Note ,
19+ ) -> Sig < SigShared < MidiChannelUdp > > {
20+ BY_TITLE . get_or_insert ( title. as_str ( ) , || {
21+ let channel = midi:: alloc_channel ( ) ;
22+ let widget = Widget :: new (
23+ title. clone ( ) ,
24+ channel,
25+ "computer-keyboard" ,
26+ vec ! [ format!( "--start-note={}" , start_note) ] ,
27+ )
28+ . unwrap ( ) ;
29+ widget. channel ( ) . shared ( )
30+ } )
1731}
1832
19- impl ComputerKeyboard {
20- pub fn new ( title : String , start_note : Note ) -> Sig < SigShared < Self > > {
21- BY_TITLE . get_or_insert ( title. as_str ( ) , || {
22- let channel = midi:: alloc_channel ( ) ;
23- let widget = Widget :: new (
24- title. clone ( ) ,
25- channel,
26- "computer-keyboard" ,
27- vec ! [ format!( "--start-note={}" , start_note) ] ,
28- )
29- . unwrap ( ) ;
30- let sig = widget. channel ( ) ;
31- Self { sig }
32- } )
33- }
33+ pub struct ComputerKeyboard {
34+ sig : Sig < SigShared < MidiChannelUdp > > ,
3435}
3536
36- impl SigT for ComputerKeyboard {
37- type Item = MidiMessages ;
37+ impl ComputerKeyboard {
38+ pub fn key_events ( & self ) -> Sig < impl SigT < Item = KeyEvents > + use < > > {
39+ self . sig . clone ( ) . key_events ( )
40+ }
3841
39- fn sample ( & mut self , ctx : & caw_core :: SigCtx ) -> impl Buf < Self :: Item > {
40- self . sig . sample ( ctx )
42+ pub fn space_button ( & self ) -> Sig < impl SigT < Item = bool > + use < > > {
43+ self . sig . clone ( ) . controllers ( ) . get_01 ( 0 ) . is_positive ( )
4144 }
4245}
4346
4447mod computer_keyboard_builder {
45- use super :: ComputerKeyboard ;
48+ use super :: * ;
4649 use caw_builder_proc_macros:: builder;
4750 use caw_core:: { Sig , SigShared } ;
4851 use caw_keyboard:: Note ;
@@ -51,15 +54,22 @@ mod computer_keyboard_builder {
5154 #[ constructor = "computer_keyboard_" ]
5255 #[ constructor_doc = "Generate midi events with a computer keyboard when this widget is focused" ]
5356 #[ generic_setter_type_name = "X" ]
54- #[ build_fn = "ComputerKeyboard::new " ]
55- #[ build_ty = "Sig<SigShared<ComputerKeyboard >>" ]
57+ #[ build_fn = "new_computer_keyboard " ]
58+ #[ build_ty = "Sig<SigShared<MidiChannelUdp >>" ]
5659 pub struct Props {
5760 title: String ,
5861 #[ default = Note :: B_1 ]
5962 start_note: Note ,
6063 }
6164 }
6265
66+ impl Props {
67+ /// Like `build` but returns a higher level object rather than a midi stream.
68+ pub fn build_ ( self ) -> ComputerKeyboard {
69+ ComputerKeyboard { sig : self . build ( ) }
70+ }
71+ }
72+
6373 pub fn computer_keyboard ( title : impl Into < String > ) -> Props {
6474 computer_keyboard_ ( title. into ( ) )
6575 }
0 commit comments