auto-musik

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | LICENSE

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(&note_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(&note_off_c4)?;
     97 
     98     std::thread::sleep(std::time::Duration::from_millis(100));
     99 
    100     println!("Done");
    101     Ok(())
    102 }
    103 */