From 2fb129369146eb5903e23f1d0487f5f833a0cd78 Mon Sep 17 00:00:00 2001 From: hellerve Date: Tue, 13 Jun 2017 17:26:55 -0400 Subject: [PATCH] initial --- .gitignore | 3 +++ Cargo.toml | 11 ++++++++ README.md | 3 +++ bundler.sh | 61 +++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 154 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 README.md create mode 100755 bundler.sh create mode 100644 src/lib.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d181f97 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.vst +target/ +*.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ada9e45 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "rist" +version = "0.0.1" +authors = ["Veit Heller "] + +[dependencies] +vst2 = "0.0.1" + +[lib] +name = "rist" +crate-type = ["dylib"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..de711b5 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# rist + +A VST plugin in Rust. diff --git a/bundler.sh b/bundler.sh new file mode 100755 index 0000000..74ddc76 --- /dev/null +++ b/bundler.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# Make sure we have the arguments we need +if [[ -z $1 || -z $2 ]]; then + echo "Generates a macOS bundle from a compiled dylib file" + echo "Example:" + echo -e "\t$0 Plugin target/release/plugin.dylib" + echo -e "\tCreates a Plugin.vst bundle" +else + # Make the bundle folder + mkdir -p "$1.vst/Contents/MacOS" + + # Create the PkgInfo + echo "BNDL????" > "$1.vst/Contents/PkgInfo" + + #build the Info.Plist + echo " + + + + CFBundleDevelopmentRegion + English + + CFBundleExecutable + $1 + + CFBundleGetInfoString + vst + + CFBundleIconFile + + + CFBundleIdentifier + com.rust-vst2.$1 + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundleName + $1 + + CFBundlePackageType + BNDL + + CFBundleVersion + 1.0 + + CFBundleSignature + $((RANDOM % 9999)) + + CSResourcesFileMapped + + + +" > "$1.vst/Contents/Info.plist" + + # move the provided library to the correct location + cp "$2" "$1.vst/Contents/MacOS/$1" + + echo "Created bundle $1.vst" +fi diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..e531612 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,76 @@ +#[macro_use] extern crate vst2; + +use vst2::buffer::AudioBuffer; +use vst2::plugin::{Plugin, Info}; + +struct Rist { + threshold: f32 +} + +impl Default for Rist { + fn default() -> Rist { + Rist { + threshold: 1.0 + } + } +} + +fn with_default(index: i32, mut fun: F, default: T) -> T where F: FnMut() -> T { + match index { + 0 => fun(), + _ => default, + } +} + + +impl Plugin for Rist { + fn get_info(&self) -> Info { + Info { + name: "Rist".to_string(), + vendor: "hellerve".to_string(), + unique_id: 1004001, + inputs: 2, + outputs: 2, + parameters: 1, + + ..Default::default() + } + } + + fn get_parameter(&self, index: i32) -> f32 { + with_default(index, || self.threshold, 0.0) + } + + fn set_parameter(&mut self, index: i32, value: f32) -> () { + with_default(index, || self.threshold = value.max(0.001), ()) + } + + fn get_parameter_name(&self, index: i32) -> String { + with_default(index, || "Threshold", "").to_string() + } + + fn get_parameter_text(&self, index: i32) -> String { + with_default(index, || format!("{}", self.threshold * 100.0), "".to_string()) + } + + fn get_parameter_label(&self, index: i32) -> String { + with_default(index, || "%", "").to_string() + } + + fn process(&mut self, buffer: AudioBuffer) { + let (i, o) = buffer.split(); + + for (ib, ob) in i.iter().zip(o) { + for (is, os) in ib.iter().zip(ob) { + if *is < 0.0 { + *os = is.max(-self.threshold) / self.threshold; + } else { + *os = is.min(self.threshold) / self.threshold; + } + } + } + } +} + + +plugin_main!(Rist);