From 0f36241687af47304ac03878bc7e4664a95a80f8 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Tue, 10 Mar 2026 12:05:18 -0600 Subject: [PATCH] get a static sf2 to bake in and its so cute --- FatBoy.sf2 | 1 - src/main.rs | 63 +++++++++++++++++++++---------------------- super_small_font.sf2 | Bin 0 -> 15340 bytes 3 files changed, 31 insertions(+), 33 deletions(-) delete mode 120000 FatBoy.sf2 create mode 100644 super_small_font.sf2 diff --git a/FatBoy.sf2 b/FatBoy.sf2 deleted file mode 120000 index 98553be..0000000 --- a/FatBoy.sf2 +++ /dev/null @@ -1 +0,0 @@ -/usr/share/soundfonts/FatBoy.sf2 \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 51d6aeb..dcf0656 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,41 +7,40 @@ use std::sync::Arc; use tinyaudio::prelude::*; fn main() { - // Load the SoundFont. - let mut sf2 = File::open("FatBoy.sf2").unwrap(); - let sound_font = Arc::new(SoundFont::new(&mut sf2).unwrap()); + // Load the SoundFont. + let mut sf2 = File::open("super_small_font.sf2").unwrap(); + let sound_font = Arc::new(SoundFont::new(&mut sf2).unwrap()); - // Setup the audio output. - let params = OutputDeviceParameters { - channels_count: 2, - sample_rate: 44100, - channel_sample_count: 4410, - }; + // Setup the audio output. + let params = OutputDeviceParameters { + channels_count: 2, + sample_rate: 44100, + channel_sample_count: 4410, + }; - // Create the synthesizer. - let settings = SynthesizerSettings::new(params.sample_rate as i32); - let mut synthesizer = Synthesizer::new(&sound_font, &settings).unwrap(); + // Create the synthesizer. + let settings = SynthesizerSettings::new(params.sample_rate as i32); + let mut synthesizer = Synthesizer::new(&sound_font, &settings).unwrap(); - // Play some notes (middle C, E, G). // 16 channels actually // 60=c 64=e 67=g //up to 128velocity though dont go below 50 tbh // 12 notes per octave - synthesizer.note_on(0, 64+12, 127); - //synthesizer.render(&mut left[..], &mut right[..]); // puts in a state of rendering the first loop of these notes + // Play some notes (middle C, E, G). // 16 channels actually // 60=c 64=e 67=g //up to 128velocity though dont go below 50 tbh // 12 notes per octave + synthesizer.note_on(0, 64 + 12, 127); + //synthesizer.render(&mut left[..], &mut right[..]); // puts in a state of rendering the first loop of these notes - // The recycled output buffer per-loop, could be in lamba but that'd be wasteful - let sample_count = (params.channel_sample_count) as usize; - let mut left: Vec = vec![0_f32; sample_count]; - let mut right: Vec = vec![0_f32; sample_count]; - // Start the audio output. Executes channel_sample_count per loop, sample_rate/channel_sample_count per second forever. - let _device = run_output_device(params, { - move |data| { - synthesizer.render(&mut left[..], &mut right[..]); // put in a state of rendering the next loop of these notes - for (i, value) in left.iter().interleave(right.iter()).enumerate() { - data[i] = *value; - } - } - }) - .unwrap(); + // The recycled output buffer per-loop, could be in lamba but that'd be wasteful + let sample_count = (params.channel_sample_count) as usize; + let mut left: Vec = vec![0_f32; sample_count]; + let mut right: Vec = vec![0_f32; sample_count]; + // Start the audio output. Executes channel_sample_count per loop, sample_rate/channel_sample_count per second forever. + let _device = run_output_device(params, { + move |data| { + synthesizer.render(&mut left[..], &mut right[..]); // put in a state of rendering the next loop of these notes + for (i, value) in left.iter().interleave(right.iter()).enumerate() { + data[i] = *value; + } + } + }) + .unwrap(); - // Let it ride - std::thread::sleep(std::time::Duration::from_secs(2)); + // Let it ride + std::thread::sleep(std::time::Duration::from_secs(2)); } - diff --git a/super_small_font.sf2 b/super_small_font.sf2 new file mode 100644 index 0000000000000000000000000000000000000000..362823d7ba802c043a5404e1518d2b6ed37d40cb GIT binary patch literal 15340 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