Check and Windows preview / check (patina) (push) Successful in 2m20s
Check and Windows preview / check (rivet) (push) Successful in 1m38s
Check and Windows preview / previews (push) Successful in 1m6s
Check and Windows preview / windows (push) Successful in 1m50s
Independent plugin release / publish (push) Successful in 8s
Independent plugin release / plan (push) Successful in 7s
Independent plugin release / build (push) Successful in 2m21s
118 lines
3.2 KiB
Rust
118 lines
3.2 KiB
Rust
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
|
|
);
|
|
}
|