use rivet_app::{AudioEngine, Shared}; use rivet_core::*; fn fixture() -> (Shared, AudioEngine, Phrase) { let mut settings = PerformanceSettings { mode: RoleMode::Alternating, ..Default::default() }; for (i, v) in settings.voices.iter_mut().enumerate() { v.controller.enabled = true; v.controller.cc = 20 + i as u8; v.controller.rest = 5 + i as u8; } let shared = Shared::default(); shared .replace(Session { performance: settings, audition: Audition::Midi, tempo: 120., ..Default::default() }) .unwrap(); let mut audio = AudioEngine::default(); audio.player.set_sample_rate(8000.).unwrap(); let phrase = Phrase { length: PPQ, notes: vec![ Note { start: 0, duration: PPQ / 2, pitch: 60, velocity: 90, ..Default::default() }, Note { start: PPQ / 2, duration: PPQ / 2, pitch: 67, velocity: 80, ..Default::default() }, ], }; (shared, audio, phrase) } #[test] fn stop_and_profile_replacement_release_old_mappings() { let (shared, mut audio, phrase) = fixture(); shared.preview(&phrase).unwrap(); audio.begin_block(&shared); let first = audio.frame(120., true); assert!(first .events .events .iter() .flatten() .any(|e| e.kind == MessageKind::On && e.channel == 0)); for _ in 0..2100 { audio.frame(120., true); } let (revision, mut state) = shared.snapshot(); state.performance.voices[0].controller.cc = 30; shared.edit(revision, state).unwrap(); audio.begin_block(&shared); let released = audio.frame(120., true); for (channel, key, value) in [(0, 20, 5), (1, 21, 6)] { assert!(released .events .events .iter() .flatten() .any(|e| e.kind == MessageKind::Control && e.channel == channel && e.key == key && e.value == value)); } assert!(released .events .events .iter() .flatten() .any(|e| e.kind == MessageKind::Off && e.channel == 1 && e.key == 67)); assert!(!released .events .events .iter() .flatten() .any(|e| e.kind == MessageKind::On)); } #[test] fn muting_midi_resets_both_controllers_and_reenabling_restores_current_state() { let (shared, mut audio, phrase) = fixture(); shared.preview(&phrase).unwrap(); audio.begin_block(&shared); audio.frame(120., true); let off = audio.frame(120., false); assert_eq!( off.events .events .iter() .flatten() .filter(|e| e.kind == MessageKind::Control) .count(), 2 ); assert_eq!(off.off, Some(60)); let on = audio.frame(120., true); assert_eq!(on.on, Some((60, 90))); assert_eq!( on.events .events .iter() .flatten() .filter(|e| e.kind == MessageKind::Control) .count(), 2 ); }