main.rs (3619B)
1 mod data; 2 mod generator; 3 mod midi_io; 4 5 use data::{Bar, NoteEvent}; 6 use generator::MusicGenerator; 7 use midi_io::MidiTransmitter; 8 9 fn main() -> Result<(), Box<dyn std::error::Error>> { 10 let target_port_name = "Microsoft GS Wavetable Synth"; 11 let mut transmitter = MidiTransmitter::new(target_port_name)?; 12 13 let mut generator = MusicGenerator::new(); 14 15 // 1分(60,000ms) / 120 = 500ms が四分音符の長さ 16 const QUARTER_NOTE_DURATION_MS: u64 = 500; 17 18 let start_time = std::time::Instant::now(); 19 let mut current_time_ms: u64 = 0; 20 21 loop { 22 let next_bar: Bar = generator.generate_next_bar(); 23 println!("Generated Chord is: {:?}", next_bar.chord); // どのコードが選ばれたか表示 24 25 let bar_duration_ms = 4 * QUARTER_NOTE_DURATION_MS; 26 27 for (event_time_offset, event) in next_bar.events.iter() { 28 let target_absolute_time_ms = current_time_ms + event_time_offset; 29 30 let elapsed_time = start_time.elapsed().as_millis() as u64; 31 32 if target_absolute_time_ms > elapsed_time { 33 let wait_time_ms = target_absolute_time_ms - elapsed_time; 34 std::thread::sleep(std::time::Duration::from_millis(wait_time_ms)); 35 } 36 37 if let Some(message) = note_event_to_midi_message(*event) 38 && let Err(e) = transmitter.send_message(&message) 39 { 40 eprintln!("Midi sending error: {}", e); 41 } 42 } 43 44 current_time_ms += bar_duration_ms; 45 46 let elapsed_time = start_time.elapsed().as_millis() as u64; 47 if current_time_ms > elapsed_time { 48 let wait_time_ms = current_time_ms - elapsed_time; 49 std::thread::sleep(std::time::Duration::from_millis(wait_time_ms)); 50 } 51 } 52 } 53 54 fn note_event_to_midi_message(event: NoteEvent) -> Option<[u8; 3]> { 55 match event { 56 NoteEvent::NoteOn { note, velocity } => Some([0x90, note, velocity]), 57 NoteEvent::NoteOff { note } => Some([0x80, note, 0]), 58 } 59 } 60 61 // ---------------------------------------------------- 62 // 3. generator.rs の調整(data.rs に合わせて) 63 // ---------------------------------------------------- 64 // generator.rs の MusicGenerator::new() で、HashMapのキーとして 65 // data::Chord を使うように修正します。 66 // 例: model.insert(Chord::First, vec![(Chord::Fourth, 7), ...]); 67 // また、generate_events_for_state() も Chord に対応させてください。 68 69 /* this is test for midi_io.ts 70 fn main() -> Result<(), Box<dyn std::error::Error>> { 71 println!("avalable Midi ports"); 72 if let Ok(midi_out) = MidiOutput::new("temp_lister") { 73 for name in MidiTransmitter::get_port_names(&midi_out) { 74 println!(" - {}", name); 75 } 76 } else { 77 println!("Failed to initialize Midi output"); 78 } 79 println!("---------------------------------"); 80 81 let target_port_name = "Synth"; 82 83 let mut transmitter = MidiTransmitter::new(target_port_name)?; 84 85 // Note On: 0x9n (n=チャンネル), ノート番号(60=C4), ベロシティ(100) 86 let note_on_c4: [u8; 3] = [0x90, 60, 100]; 87 // Note Off: 0x8n (n=チャンネル), ノート番号(60=C4), ベロシティ(0) 88 let note_off_c4: [u8; 3] = [0x80, 60, 0]; 89 90 println!("Sending C4 vel 100 on channel"); 91 transmitter.send_message(¬e_on_c4)?; 92 93 std::thread::sleep(std::time::Duration::from_millis(500)); 94 95 println!("Sending C4 vel 100 off channel"); 96 transmitter.send_message(¬e_off_c4)?; 97 98 std::thread::sleep(std::time::Duration::from_millis(100)); 99 100 println!("Done"); 101 Ok(()) 102 } 103 */