old school music tracker audio backend
1use torque_tracker_engine::{
2 audio_processing::playback::PlaybackState,
3 file::impulse_format::header::PatternOrder,
4 manager::PlaybackSettings,
5 project::{
6 event_command::NoteCommand,
7 note_event::{Note, NoteEvent, VolumeEffect},
8 pattern::InPatternPosition,
9 song::Song,
10 },
11 sample::{Sample, SampleMetaData},
12};
13
14fn main() {
15 let mut reader = hound::WavReader::open("test-files/770_Hz_Tone.wav").unwrap();
16 let spec = reader.spec();
17 println!("sample specs: {spec:?}");
18 assert!(spec.channels == 1);
19 let sample_data = reader
20 .samples::<i16>()
21 .map(|result| <f32 as dasp::Sample>::from_sample(result.unwrap()));
22 let sample = Sample::new_mono(sample_data);
23
24 let meta = SampleMetaData {
25 sample_rate: spec.sample_rate,
26 ..Default::default()
27 };
28
29 let mut song: Song = Song::default();
30 song.pattern_order[0] = PatternOrder::Number(0);
31 song.samples[0] = Some((meta, sample));
32 song.patterns[0].set_event(
33 InPatternPosition { row: 0, channel: 0 },
34 NoteEvent {
35 note: Note::default(),
36 sample_instr: 0,
37 vol: VolumeEffect::None,
38 command: NoteCommand::None,
39 },
40 );
41 song.patterns[0].set_event(
42 InPatternPosition { row: 0, channel: 2 },
43 NoteEvent {
44 note: Note::default(),
45 sample_instr: 0,
46 vol: VolumeEffect::None,
47 command: NoteCommand::None,
48 },
49 );
50
51 let mut playback = PlaybackState::new(&song, 44100, PlaybackSettings::default()).unwrap();
52 let iter = playback.iter::<0>(&song);
53 for _ in iter.take(50) {
54 // dbg!(frame);
55 }
56}