1
+ extern crate clap;
1
2
extern crate enigo;
2
3
extern crate midir;
3
4
@@ -6,6 +7,8 @@ use std::time::Duration;
6
7
use std:: thread;
7
8
use std:: fmt:: Write ;
8
9
10
+ use clap:: { App , Arg } ;
11
+
9
12
use enigo:: KeyboardControllable ;
10
13
11
14
use midir:: { Ignore , MidiInput , MidiInputConnection } ;
@@ -69,8 +72,31 @@ fn parse_message(message: &[u8]) -> Result<MidiMessage, MidiError> {
69
72
}
70
73
71
74
fn main ( ) {
72
- list_devices ( ) . unwrap ( ) ;
73
- run ( MIDI_DEV_NAME ) . unwrap ( ) ;
75
+ let matches = App :: new ( "Midi Perform" )
76
+ . version ( "0.2.0" )
77
+ . author ( "Sean Cross <[email protected] >" )
78
+ . about ( "Accepts MIDI controller data and simulates keyboard presses" )
79
+ . arg (
80
+ Arg :: with_name ( "list" )
81
+ . short ( "l" )
82
+ . help ( "List available devices" ) ,
83
+ )
84
+ . arg (
85
+ Arg :: with_name ( "device" )
86
+ . short ( "d" )
87
+ . help ( "Connect to specified device" )
88
+ . value_name ( "DEVICE" ) ,
89
+ )
90
+ . get_matches ( ) ;
91
+
92
+ if matches. is_present ( "list" ) {
93
+ list_devices ( ) . expect ( "unable to list MIDI devices" ) ;
94
+ return ;
95
+ }
96
+
97
+ let device_name = matches. value_of ( "DEVICE" ) . unwrap_or ( MIDI_DEV_NAME ) ;
98
+ println ! ( "Attempting to connect to device {}" , device_name) ;
99
+ run ( device_name) . unwrap ( ) ;
74
100
}
75
101
76
102
fn midi_callback ( _timestamp_us : u64 , raw_message : & [ u8 ] , keygen : & mut enigo:: Enigo ) {
@@ -171,7 +197,6 @@ fn run(midi_name: &str) -> Result<(), Box<Error>> {
171
197
172
198
let mut device_idx: Option < usize > = None ;
173
199
174
- println ! ( "Attempting to connect to {}" , target_device_name) ;
175
200
let mut connection: Option < MidiInputConnection < ( ) > > = None ;
176
201
177
202
loop {
@@ -195,10 +220,7 @@ fn run(midi_name: &str) -> Result<(), Box<Error>> {
195
220
} ;
196
221
197
222
if connection. is_none ( ) {
198
- println ! (
199
- "Recreating midi connection. Looking for {}..." ,
200
- target_device_name
201
- ) ;
223
+ println ! ( "Connecting to MIDI. Detected devices:" ) ;
202
224
for i in 0 ..midi_in. port_count ( ) {
203
225
match midi_in. port_name ( i) {
204
226
Err ( _) => ( ) ,
@@ -209,7 +231,7 @@ fn run(midi_name: &str) -> Result<(), Box<Error>> {
209
231
}
210
232
}
211
233
}
212
- println ! ( "{}: {}" , i , midi_in. port_name( i) ?) ;
234
+ println ! ( " {}" , midi_in. port_name( i) ?) ;
213
235
}
214
236
}
215
237
@@ -226,13 +248,12 @@ fn run(midi_name: &str) -> Result<(), Box<Error>> {
226
248
) {
227
249
Err ( reason) => println ! ( "Unable to connect to device: {:?}" , reason) ,
228
250
Ok ( conn) => {
251
+ println ! ( "Connection established" ) ;
229
252
connection = Some ( conn) ;
230
253
}
231
254
}
232
255
}
233
256
}
234
- /*
235
- */
236
257
thread:: sleep ( Duration :: from_secs ( 1 ) ) ;
237
258
}
238
259
}
@@ -241,9 +262,9 @@ fn list_devices() -> Result<(), Box<Error>> {
241
262
let mut midi_in = MidiInput :: new ( "keyboard-tweak" ) ?;
242
263
midi_in. ignore ( Ignore :: None ) ;
243
264
244
- println ! ( "Available input ports :" ) ;
265
+ println ! ( "Available MIDI devices :" ) ;
245
266
for i in 0 ..midi_in. port_count ( ) {
246
- println ! ( "{}: {}" , i , midi_in. port_name( i) ?) ;
267
+ println ! ( " {}" , midi_in. port_name( i) ?) ;
247
268
}
248
269
249
270
Ok ( ( ) )
0 commit comments