Add sigil-dsp package with vendored SoundPipe and native bindings
Vendor 43 Phase 1 SoundPipe modules (oscillators, filters, envelopes, effects, noise, utility) and create native Sigil bindings with GC-managed foreign objects. Includes Sigil wrapper modules with define-native declarations and convenience constructors (make-oscillator, make-filter).
Modules: (sigil dsp core), (sigil dsp osc), (sigil dsp filter), (sigil dsp env), (sigil dsp fx), (sigil dsp noise), (sigil dsp util)
.gitignore | 3 +
README.md | 58 ++-
package.sgl | 160 +++++++
sigil.lock | 8 +
src/c/dsp.c | 1998 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/sigil/dsp/core.sgl | 23 ++
src/sigil/dsp/env.sgl | 33 ++
src/sigil/dsp/filter.sgl | 42 ++
src/sigil/dsp/fx.sgl | 34 ++
src/sigil/dsp/noise.sgl | 24 ++
src/sigil/dsp/osc.sgl | 69 ++++
src/sigil/dsp/test-main.sgl | 74 ++++
src/sigil/dsp/util.sgl | 51 +++
test/basic-test.sgl | 5 +
vendor/soundpipe/h/adsr.h | 19 +
vendor/soundpipe/h/atone.h | 10 +
vendor/soundpipe/h/base.h | 97 +++++
vendor/soundpipe/h/blsaw.h | 12 +
vendor/soundpipe/h/blsquare.h | 13 +
vendor/soundpipe/h/bltriangle.h | 12 +
vendor/soundpipe/h/brown.h | 8 +
vendor/soundpipe/h/buthp.h | 11 +
vendor/soundpipe/h/butlp.h | 11 +
vendor/soundpipe/h/clamp.h | 9 +
vendor/soundpipe/h/clip.h | 8 +
vendor/soundpipe/h/clock.h | 10 +
vendor/soundpipe/h/crossfade.h | 8 +
vendor/soundpipe/h/dcblock.h | 11 +
vendor/soundpipe/h/delay.h | 13 +
vendor/soundpipe/h/expon.h | 11 +
vendor/soundpipe/h/fosc.h | 10 +
vendor/soundpipe/h/ftbl.h | 29 ++
vendor/soundpipe/h/line.h | 11 +
vendor/soundpipe/h/lpf18.h | 9 +
vendor/soundpipe/h/metro.h | 11 +
vendor/soundpipe/h/moogladder.h | 17 +
vendor/soundpipe/h/noise.h | 8 +
vendor/soundpipe/h/osc.h | 11 +
vendor/soundpipe/h/pan2.h | 9 +
vendor/soundpipe/h/peaklim.h | 10 +
vendor/soundpipe/h/phasor.h | 9 +
vendor/soundpipe/h/pinknoise.h | 15 +
vendor/soundpipe/h/port.h | 11 +
vendor/soundpipe/h/posc3.h | 13 +
vendor/soundpipe/h/randh.h | 11 +
vendor/soundpipe/h/randi.h | 13 +
vendor/soundpipe/h/randmt.h | 10 +
vendor/soundpipe/h/revsc.h | 28 ++
vendor/soundpipe/h/saturator.h | 15 +
vendor/soundpipe/h/scale.h | 8 +
vendor/soundpipe/h/soundpipe.h | 617 +++++++++++++++++++++++++++
vendor/soundpipe/h/tadsr.h | 20 +
vendor/soundpipe/h/tenv.h | 14 +
vendor/soundpipe/h/tgate.h | 9 +
vendor/soundpipe/h/tone.h | 10 +
vendor/soundpipe/h/vdelay.h | 14 +
vendor/soundpipe/h/wavout.h | 5 +
vendor/soundpipe/h/zitarev.h | 21 +
vendor/soundpipe/lib/dr_wav/Makefile | 5 +
vendor/soundpipe/lib/dr_wav/dr_wav.c | 2 +
vendor/soundpipe/lib/dr_wav/dr_wav.h | 3490 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
vendor/soundpipe/lib/faust/CUI.h | 16 +
vendor/soundpipe/modules/adsr.c | 95 +++++
vendor/soundpipe/modules/atone.c | 63 +++
vendor/soundpipe/modules/base.c | 198 +++++++++
vendor/soundpipe/modules/blsaw.c | 171 ++++++++
vendor/soundpipe/modules/blsquare.c | 185 +++++++++
vendor/soundpipe/modules/bltriangle.c | 202 +++++++++
vendor/soundpipe/modules/brown.c | 47 +++
vendor/soundpipe/modules/buthp.c | 83 ++++
vendor/soundpipe/modules/butlp.c | 81 ++++
vendor/soundpipe/modules/clamp.c | 29 ++
vendor/soundpipe/modules/clip.c | 61 +++
vendor/soundpipe/modules/clock.c | 41 ++
vendor/soundpipe/modules/crossfade.c | 26 ++
vendor/soundpipe/modules/dcblock.c | 51 +++
vendor/soundpipe/modules/delay.c | 40 ++
vendor/soundpipe/modules/expon.c | 78 ++++
vendor/soundpipe/modules/fosc.c | 101 +++++
vendor/soundpipe/modules/ftbl.c | 406 ++++++++++++++++++
vendor/soundpipe/modules/line.c | 57 +++
vendor/soundpipe/modules/lpf18.c | 98 +++++
vendor/soundpipe/modules/metro.c | 60 +++
vendor/soundpipe/modules/moogladder.c | 122 ++++++
vendor/soundpipe/modules/noise.c | 29 ++
vendor/soundpipe/modules/osc.c | 71 ++++
vendor/soundpipe/modules/pan2.c | 83 ++++
vendor/soundpipe/modules/peaklim.c | 80 ++++
vendor/soundpipe/modules/phasor.c | 52 +++
vendor/soundpipe/modules/pinknoise.c | 69 ++++
vendor/soundpipe/modules/port.c | 66 +++
vendor/soundpipe/modules/posc3.c | 93 +++++
vendor/soundpipe/modules/randh.c | 44 ++
vendor/soundpipe/modules/randi.c | 98 +++++
vendor/soundpipe/modules/randmt.c | 135 ++++++
vendor/soundpipe/modules/revsc.c | 279 +++++++++++++
vendor/soundpipe/modules/saturator.c | 109 +++++
vendor/soundpipe/modules/scale.c | 27 ++
vendor/soundpipe/modules/tadsr.c | 152 +++++++
vendor/soundpipe/modules/tenv.c | 90 ++++
vendor/soundpipe/modules/tgate.c | 34 ++
vendor/soundpipe/modules/tone.c | 68 +++
vendor/soundpipe/modules/vdelay.c | 116 ++++++
vendor/soundpipe/modules/wavout.c | 53 +++
vendor/soundpipe/modules/zitarev.c | 1062 +++++++++++++++++++++++++++++++++++++++++++++++
105 files changed, 12430 insertions(+), 1 deletion(-).gitignoreadded
build/.sigil/sigil.lockREADME.mdmodified
# sigil-dspDigital signal processing library for Sigil — oscillators, filters, effects, envelopes via vendored SoundPipe No newline at end of fileDSP primitives for Sigil via vendored [SoundPipe](https://github.com/PaulBatchelor/Soundpipe).## Modules- `(sigil dsp core)` -- DSP engine lifecycle, function tables- `(sigil dsp osc)` -- Oscillators: sine, saw, square, triangle, FM, phasor- `(sigil dsp filter)` -- Filters: Moog ladder, Butterworth, resonant LP, DC block- `(sigil dsp env)` -- Envelopes: ADSR, triggered, line, exponential, portamento- `(sigil dsp fx)` -- Effects: stereo reverb (revsc, zitarev), delay, variable delay- `(sigil dsp noise)` -- Noise: white, pink, brown- `(sigil dsp util)` -- Panning, dynamics, timing, random modulation, scaling, WAV output## Usage```scheme(import (sigil dsp core) (sigil dsp osc) (sigil dsp filter))(dsp-init 44100);; Create a 440Hz sine oscillator(define osc (make-osc 440.0 1.0));; Or use the convenience constructor(define saw (make-oscillator 'saw 220.0 0.8));; Create a lowpass filter(define filt (make-moogladder 1000.0 0.4));; Per-sample processing(let ((sample (osc-compute osc))) (filter-compute filt sample))(dsp-shutdown)```## Building```bashsigil deps installsigil build```## TestingThe test entry point exercises all module categories:```bash# Add entry: '(sigil dsp test-main) to package.sgl, then:sigil build --forcesigil run```## LicenseMIT (SoundPipe) / BSD-3-Clause (sigil-dsp bindings)package.sgladded
;;; sigil-dsp - DSP primitives for Sigil;;;;;; Provides oscillators, filters, envelopes, effects, noise generators,;;; and utility modules via vendored SoundPipe.(package name: "sigil-dsp" version: "0.1.0" description: "DSP primitives for Sigil (SoundPipe bindings)" url: "https://codeberg.org/sigil/sigil-dsp" license: "MIT" authors: (list "David Wilson <[email protected]>") configs: (list (config name: 'dev output-dir: "build/dev" debug?: #t optimize: 0) (config name: 'release output-dir: "build/release" debug?: #f optimize: 2)) dependencies: (list (from-git url: "codeberg:sigil/sigil" package: "sigil-stdlib" version: "^0.9.0")) libraries: (list (library name: 'sigil-dsp c-sources: '(;; SoundPipe core "vendor/soundpipe/modules/base.c" "vendor/soundpipe/modules/ftbl.c" "vendor/soundpipe/modules/randmt.c" ;; Oscillators "vendor/soundpipe/modules/osc.c" "vendor/soundpipe/modules/posc3.c" "vendor/soundpipe/modules/blsaw.c" "vendor/soundpipe/modules/blsquare.c" "vendor/soundpipe/modules/bltriangle.c" "vendor/soundpipe/modules/fosc.c" "vendor/soundpipe/modules/phasor.c" ;; Filters "vendor/soundpipe/modules/moogladder.c" "vendor/soundpipe/modules/butlp.c" "vendor/soundpipe/modules/buthp.c" "vendor/soundpipe/modules/lpf18.c" "vendor/soundpipe/modules/tone.c" "vendor/soundpipe/modules/atone.c" "vendor/soundpipe/modules/dcblock.c" ;; Envelopes "vendor/soundpipe/modules/adsr.c" "vendor/soundpipe/modules/tadsr.c" "vendor/soundpipe/modules/tenv.c" "vendor/soundpipe/modules/line.c" "vendor/soundpipe/modules/expon.c" "vendor/soundpipe/modules/port.c" ;; Reverb "vendor/soundpipe/modules/revsc.c" "vendor/soundpipe/modules/zitarev.c" ;; Delay "vendor/soundpipe/modules/delay.c" "vendor/soundpipe/modules/vdelay.c" ;; Noise "vendor/soundpipe/modules/noise.c" "vendor/soundpipe/modules/pinknoise.c" "vendor/soundpipe/modules/brown.c" ;; Dynamics / Waveshaping "vendor/soundpipe/modules/saturator.c" "vendor/soundpipe/modules/clip.c" "vendor/soundpipe/modules/peaklim.c" ;; Spatial "vendor/soundpipe/modules/pan2.c" ;; Timing "vendor/soundpipe/modules/metro.c" "vendor/soundpipe/modules/clock.c" "vendor/soundpipe/modules/tgate.c" ;; Modulation "vendor/soundpipe/modules/randh.c" "vendor/soundpipe/modules/randi.c" ;; Utility "vendor/soundpipe/modules/scale.c" "vendor/soundpipe/modules/clamp.c" "vendor/soundpipe/modules/crossfade.c" ;; Output "vendor/soundpipe/modules/wavout.c" ;; dr_wav implementation "vendor/soundpipe/lib/dr_wav/dr_wav.c" ;; Native bindings "src/c/dsp.c") c-include-dirs: '("vendor/soundpipe/h" "vendor/soundpipe/lib/faust" "vendor/soundpipe/lib/dr_wav") c-flags: '("-DNO_LIBSNDFILE" "-DSPFLOAT=float" "-Wno-unused-parameter" "-Wno-sign-compare") native-init: "sigil__init_sigil_dsp_module" link-flags: '("-lm"))) tasks: (list (task name: 'build description: "Build sigil-dsp" steps: (list (compile-c-sources sources: '("vendor/soundpipe/modules/base.c" "vendor/soundpipe/modules/ftbl.c" "vendor/soundpipe/modules/randmt.c" "vendor/soundpipe/modules/osc.c" "vendor/soundpipe/modules/posc3.c" "vendor/soundpipe/modules/blsaw.c" "vendor/soundpipe/modules/blsquare.c" "vendor/soundpipe/modules/bltriangle.c" "vendor/soundpipe/modules/fosc.c" "vendor/soundpipe/modules/phasor.c" "vendor/soundpipe/modules/moogladder.c" "vendor/soundpipe/modules/butlp.c" "vendor/soundpipe/modules/buthp.c" "vendor/soundpipe/modules/lpf18.c" "vendor/soundpipe/modules/tone.c" "vendor/soundpipe/modules/atone.c" "vendor/soundpipe/modules/dcblock.c" "vendor/soundpipe/modules/adsr.c" "vendor/soundpipe/modules/tadsr.c" "vendor/soundpipe/modules/tenv.c" "vendor/soundpipe/modules/line.c" "vendor/soundpipe/modules/expon.c" "vendor/soundpipe/modules/port.c" "vendor/soundpipe/modules/revsc.c" "vendor/soundpipe/modules/zitarev.c" "vendor/soundpipe/modules/delay.c" "vendor/soundpipe/modules/vdelay.c" "vendor/soundpipe/modules/noise.c" "vendor/soundpipe/modules/pinknoise.c" "vendor/soundpipe/modules/brown.c" "vendor/soundpipe/modules/saturator.c" "vendor/soundpipe/modules/clip.c" "vendor/soundpipe/modules/peaklim.c" "vendor/soundpipe/modules/pan2.c" "vendor/soundpipe/modules/metro.c" "vendor/soundpipe/modules/clock.c" "vendor/soundpipe/modules/tgate.c" "vendor/soundpipe/modules/randh.c" "vendor/soundpipe/modules/randi.c" "vendor/soundpipe/modules/scale.c" "vendor/soundpipe/modules/clamp.c" "vendor/soundpipe/modules/crossfade.c" "vendor/soundpipe/modules/wavout.c" "vendor/soundpipe/lib/dr_wav/dr_wav.c" "src/c/dsp.c") include-dirs: '("../sigil/packages/sigil-lib/include" "../sigil/packages/sigil-lib/src" "vendor/soundpipe/h" "vendor/soundpipe/lib/faust" "vendor/soundpipe/lib/dr_wav") flags: '("-std=c99" "-D_GNU_SOURCE" "-DNO_LIBSNDFILE" "-DSPFLOAT=float" "-Wno-unused-parameter" "-Wno-unused-function" "-Wno-sign-compare")) (create-static-library name: "sigil-dsp") (compile-sigil-modules sources: "src/**/*.sgl" output-dir: (config-output-subdir "lib"))))))sigil.lockadded
;; Auto-generated by sigil deps install. Do not edit.(lock (package name: "sigil-stdlib" url: "codeberg:sigil/sigil" ref: "^0.9.0" sha: "0123d3fc7d2dd37e5c27e9fade7d11b817deb21a" package-selector: "sigil-stdlib"))src/c/dsp.cadded
/* * dsp.c - Sigil DSP Module * * Native bindings for SoundPipe DSP primitives. * Provides oscillators, filters, envelopes, effects, noise generators, * and utility modules for audio synthesis. */#include <sigil/sigil.h>#include <stdlib.h>#include <string.h>#include <math.h>#include "soundpipe.h"/* ============================================================ * GLOBAL STATE * ============================================================ */static sp_data *g_sp = NULL;/* Type tags for foreign objects */static Value tt_osc = SIGIL_UNDEFINED;static Value tt_posc3 = SIGIL_UNDEFINED;static Value tt_blsaw = SIGIL_UNDEFINED;static Value tt_blsquare = SIGIL_UNDEFINED;static Value tt_bltriangle = SIGIL_UNDEFINED;static Value tt_fosc = SIGIL_UNDEFINED;static Value tt_phasor = SIGIL_UNDEFINED;static Value tt_moogladder = SIGIL_UNDEFINED;static Value tt_butlp = SIGIL_UNDEFINED;static Value tt_buthp = SIGIL_UNDEFINED;static Value tt_lpf18 = SIGIL_UNDEFINED;static Value tt_tone = SIGIL_UNDEFINED;static Value tt_atone = SIGIL_UNDEFINED;static Value tt_dcblock = SIGIL_UNDEFINED;static Value tt_adsr = SIGIL_UNDEFINED;static Value tt_tadsr = SIGIL_UNDEFINED;static Value tt_tenv = SIGIL_UNDEFINED;static Value tt_line = SIGIL_UNDEFINED;static Value tt_expon = SIGIL_UNDEFINED;static Value tt_port = SIGIL_UNDEFINED;static Value tt_revsc = SIGIL_UNDEFINED;static Value tt_zitarev = SIGIL_UNDEFINED;static Value tt_delay = SIGIL_UNDEFINED;static Value tt_vdelay = SIGIL_UNDEFINED;static Value tt_noise = SIGIL_UNDEFINED;static Value tt_pinknoise = SIGIL_UNDEFINED;static Value tt_brown = SIGIL_UNDEFINED;static Value tt_saturator = SIGIL_UNDEFINED;static Value tt_clip = SIGIL_UNDEFINED;static Value tt_peaklim = SIGIL_UNDEFINED;static Value tt_pan2 = SIGIL_UNDEFINED;static Value tt_metro = SIGIL_UNDEFINED;static Value tt_clock = SIGIL_UNDEFINED;static Value tt_tgate = SIGIL_UNDEFINED;static Value tt_randh = SIGIL_UNDEFINED;static Value tt_randi = SIGIL_UNDEFINED;static Value tt_scale = SIGIL_UNDEFINED;static Value tt_clamp = SIGIL_UNDEFINED;static Value tt_crossfade = SIGIL_UNDEFINED;static Value tt_wavout = SIGIL_UNDEFINED;static Value tt_ftbl = SIGIL_UNDEFINED;/* ============================================================ * HELPERS * ============================================================ */#define ENSURE_TAG(vm, tag, name) \ if (sigil_is_undefined(tag)) { \ tag = sigil_intern_symbol(vm, name, strlen(name)); \ }#define CHECK_SP(vm, funcname) \ if (!g_sp) { \ sigil__vm_set_error(vm, SIGIL_ERR_RUNTIME, funcname ": DSP not initialized, call dsp-init first"); \ return SIGIL_FALSE; \ }/* Wrapper struct for wavetable oscillator (owns ftbl) */typedef struct { sp_osc *osc; sp_ftbl *ft;} dsp_osc;/* Wrapper struct for posc3 (owns ftbl) */typedef struct { sp_posc3 *osc; sp_ftbl *ft;} dsp_posc3;/* Wrapper struct for fosc (owns ftbl) */typedef struct { sp_fosc *osc; sp_ftbl *ft;} dsp_fosc;/* ============================================================ * DESTRUCTORS * ============================================================ */static void destroy_osc(void *data) { dsp_osc *d = (dsp_osc *)data; if (d->osc) sp_osc_destroy(&d->osc); if (d->ft) sp_ftbl_destroy(&d->ft); free(d);}static void destroy_posc3(void *data) { dsp_posc3 *d = (dsp_posc3 *)data; if (d->osc) sp_posc3_destroy(&d->osc); if (d->ft) sp_ftbl_destroy(&d->ft); free(d);}static void destroy_blsaw(void *data) { sp_blsaw *p = (sp_blsaw *)data; sp_blsaw_destroy(&p); }static void destroy_blsquare(void *data) { sp_blsquare *p = (sp_blsquare *)data; sp_blsquare_destroy(&p); }static void destroy_bltriangle(void *data) { sp_bltriangle *p = (sp_bltriangle *)data; sp_bltriangle_destroy(&p); }static void destroy_fosc(void *data) { dsp_fosc *d = (dsp_fosc *)data; if (d->osc) sp_fosc_destroy(&d->osc); if (d->ft) sp_ftbl_destroy(&d->ft); free(d);}static void destroy_phasor(void *data) { sp_phasor *p = (sp_phasor *)data; sp_phasor_destroy(&p); }static void destroy_moogladder(void *data) { sp_moogladder *p = (sp_moogladder *)data; sp_moogladder_destroy(&p); }static void destroy_butlp(void *data) { sp_butlp *p = (sp_butlp *)data; sp_butlp_destroy(&p); }static void destroy_buthp(void *data) { sp_buthp *p = (sp_buthp *)data; sp_buthp_destroy(&p); }static void destroy_lpf18(void *data) { sp_lpf18 *p = (sp_lpf18 *)data; sp_lpf18_destroy(&p); }static void destroy_tone(void *data) { sp_tone *p = (sp_tone *)data; sp_tone_destroy(&p); }static void destroy_atone(void *data) { sp_atone *p = (sp_atone *)data; sp_atone_destroy(&p); }static void destroy_dcblock(void *data) { sp_dcblock *p = (sp_dcblock *)data; sp_dcblock_destroy(&p); }static void destroy_adsr(void *data) { sp_adsr *p = (sp_adsr *)data; sp_adsr_destroy(&p); }static void destroy_tadsr(void *data) { sp_tadsr *p = (sp_tadsr *)data; sp_tadsr_destroy(&p); }static void destroy_tenv(void *data) { sp_tenv *p = (sp_tenv *)data; sp_tenv_destroy(&p); }static void destroy_line(void *data) { sp_line *p = (sp_line *)data; sp_line_destroy(&p); }static void destroy_expon(void *data) { sp_expon *p = (sp_expon *)data; sp_expon_destroy(&p); }static void destroy_port(void *data) { sp_port *p = (sp_port *)data; sp_port_destroy(&p); }static void destroy_revsc(void *data) { sp_revsc *p = (sp_revsc *)data; sp_revsc_destroy(&p); }static void destroy_zitarev(void *data) { sp_zitarev *p = (sp_zitarev *)data; sp_zitarev_destroy(&p); }static void destroy_delay(void *data) { sp_delay *p = (sp_delay *)data; sp_delay_destroy(&p); }static void destroy_vdelay(void *data) { sp_vdelay *p = (sp_vdelay *)data; sp_vdelay_destroy(&p); }static void destroy_noise(void *data) { sp_noise *p = (sp_noise *)data; sp_noise_destroy(&p); }static void destroy_pinknoise(void *data) { sp_pinknoise *p = (sp_pinknoise *)data; sp_pinknoise_destroy(&p); }static void destroy_brown(void *data) { sp_brown *p = (sp_brown *)data; sp_brown_destroy(&p); }static void destroy_saturator(void *data) { sp_saturator *p = (sp_saturator *)data; sp_saturator_destroy(&p); }static void destroy_clip(void *data) { sp_clip *p = (sp_clip *)data; sp_clip_destroy(&p); }static void destroy_peaklim(void *data) { sp_peaklim *p = (sp_peaklim *)data; sp_peaklim_destroy(&p); }static void destroy_pan2(void *data) { sp_pan2 *p = (sp_pan2 *)data; sp_pan2_destroy(&p); }static void destroy_metro(void *data) { sp_metro *p = (sp_metro *)data; sp_metro_destroy(&p); }static void destroy_clock(void *data) { sp_clock *p = (sp_clock *)data; sp_clock_destroy(&p); }static void destroy_tgate(void *data) { sp_tgate *p = (sp_tgate *)data; sp_tgate_destroy(&p); }static void destroy_randh(void *data) { sp_randh *p = (sp_randh *)data; sp_randh_destroy(&p); }static void destroy_randi(void *data) { sp_randi *p = (sp_randi *)data; sp_randi_destroy(&p); }static void destroy_scale(void *data) { sp_scale *p = (sp_scale *)data; sp_scale_destroy(&p); }static void destroy_clamp(void *data) { sp_clamp *p = (sp_clamp *)data; sp_clamp_destroy(&p); }static void destroy_crossfade(void *data) { sp_crossfade *p = (sp_crossfade *)data; sp_crossfade_destroy(&p); }static void destroy_wavout(void *data) { sp_wavout *p = (sp_wavout *)data; sp_wavout_destroy(&p); }static void destroy_ftbl(void *data) { sp_ftbl *p = (sp_ftbl *)data; sp_ftbl_destroy(&p); }/* ============================================================ * TYPE GETTERS * ============================================================ */#define DEF_GETTER(name, sp_type, tag, label) \ static sp_type *get_##name(SigilVM *vm, Value v) { \ ENSURE_TAG(vm, tag, "dsp-" label); \ if (!sigil_is_foreign_type(v, tag)) return NULL; \ return (sp_type *)sigil_foreign_get_data(v); \ }/* Wrapper getters return the wrapper struct */static dsp_osc *get_osc(SigilVM *vm, Value v) { ENSURE_TAG(vm, tt_osc, "dsp-osc"); if (!sigil_is_foreign_type(v, tt_osc)) return NULL; return (dsp_osc *)sigil_foreign_get_data(v);}static dsp_posc3 *get_posc3(SigilVM *vm, Value v) { ENSURE_TAG(vm, tt_posc3, "dsp-posc3"); if (!sigil_is_foreign_type(v, tt_posc3)) return NULL; return (dsp_posc3 *)sigil_foreign_get_data(v);}static dsp_fosc *get_fosc(SigilVM *vm, Value v) { ENSURE_TAG(vm, tt_fosc, "dsp-fosc"); if (!sigil_is_foreign_type(v, tt_fosc)) return NULL; return (dsp_fosc *)sigil_foreign_get_data(v);}DEF_GETTER(blsaw, sp_blsaw, tt_blsaw, "blsaw")DEF_GETTER(blsquare, sp_blsquare, tt_blsquare, "blsquare")DEF_GETTER(bltriangle, sp_bltriangle, tt_bltriangle, "bltriangle")DEF_GETTER(phasor, sp_phasor, tt_phasor, "phasor")DEF_GETTER(moogladder, sp_moogladder, tt_moogladder, "moogladder")DEF_GETTER(butlp, sp_butlp, tt_butlp, "butlp")DEF_GETTER(buthp, sp_buthp, tt_buthp, "buthp")DEF_GETTER(lpf18, sp_lpf18, tt_lpf18, "lpf18")DEF_GETTER(tone, sp_tone, tt_tone, "tone")DEF_GETTER(atone, sp_atone, tt_atone, "atone")DEF_GETTER(dcblock, sp_dcblock, tt_dcblock, "dcblock")DEF_GETTER(adsr, sp_adsr, tt_adsr, "adsr")DEF_GETTER(tadsr, sp_tadsr, tt_tadsr, "tadsr")DEF_GETTER(tenv, sp_tenv, tt_tenv, "tenv")DEF_GETTER(line, sp_line, tt_line, "line")DEF_GETTER(expon, sp_expon, tt_expon, "expon")DEF_GETTER(port, sp_port, tt_port, "port")DEF_GETTER(revsc, sp_revsc, tt_revsc, "revsc")DEF_GETTER(zitarev, sp_zitarev, tt_zitarev, "zitarev")DEF_GETTER(delay, sp_delay, tt_delay, "delay")DEF_GETTER(vdelay, sp_vdelay, tt_vdelay, "vdelay")DEF_GETTER(noise, sp_noise, tt_noise, "noise")DEF_GETTER(pinknoise, sp_pinknoise, tt_pinknoise, "pinknoise")DEF_GETTER(brown, sp_brown, tt_brown, "brown")DEF_GETTER(saturator, sp_saturator, tt_saturator, "saturator")DEF_GETTER(clip, sp_clip, tt_clip, "clip")DEF_GETTER(peaklim, sp_peaklim, tt_peaklim, "peaklim")DEF_GETTER(pan2, sp_pan2, tt_pan2, "pan2")DEF_GETTER(metro, sp_metro, tt_metro, "metro")DEF_GETTER(clock_mod, sp_clock, tt_clock, "clock")DEF_GETTER(tgate, sp_tgate, tt_tgate, "tgate")DEF_GETTER(randh, sp_randh, tt_randh, "randh")DEF_GETTER(randi, sp_randi, tt_randi, "randi")DEF_GETTER(scale, sp_scale, tt_scale, "scale")DEF_GETTER(clamp, sp_clamp, tt_clamp, "clamp")DEF_GETTER(crossfade, sp_crossfade, tt_crossfade, "crossfade")DEF_GETTER(wavout, sp_wavout, tt_wavout, "wavout")/* ============================================================ * CORE — dsp-init, dsp-shutdown, dsp-sample-rate * ============================================================ *//* (dsp-init [sample-rate]) *//* Helper to get a number as double from either fixnum or flonum */static double as_number(Value v){ if (sigil_is_fixnum(v)) return (double)sigil_as_fixnum(v); return sigil_as_flonum(v);}static Value native_dsp_init(SigilVM *vm, int argc, Value *args){ (void)vm; if (g_sp) return SIGIL_TRUE; sp_create(&g_sp); if (argc > 0) { g_sp->sr = (int)as_number(args[0]); } return SIGIL_TRUE;}/* (dsp-shutdown) */static Value native_dsp_shutdown(SigilVM *vm, int argc, Value *args){ (void)vm; (void)argc; (void)args; if (g_sp) { sp_destroy(&g_sp); g_sp = NULL; } return SIGIL_NIL;}/* (dsp-sample-rate) -> fixnum */static Value native_dsp_sample_rate(SigilVM *vm, int argc, Value *args){ (void)argc; (void)args; CHECK_SP(vm, "dsp-sample-rate"); return sigil_fixnum(g_sp->sr);}/* ============================================================ * FUNCTION TABLES * ============================================================ *//* (make-ftbl size) -> <ftbl> */static Value native_make_ftbl(SigilVM *vm, int argc, Value *args){ CHECK_SP(vm, "make-ftbl"); size_t size = (size_t)sigil_as_flonum(args[0]); sp_ftbl *ft; sp_ftbl_create(g_sp, &ft, size); ENSURE_TAG(vm, tt_ftbl, "dsp-ftbl"); return sigil_make_foreign(vm, tt_ftbl, ft, destroy_ftbl, sizeof(sp_ftbl) + size * sizeof(SPFLOAT));}/* (ftbl-gen-sine ftbl) */static Value native_ftbl_gen_sine(SigilVM *vm, int argc, Value *args){ CHECK_SP(vm, "ftbl-gen-sine"); ENSURE_TAG(vm, tt_ftbl, "dsp-ftbl"); if (!sigil_is_foreign_type(args[0], tt_ftbl)) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "ftbl-gen-sine: expected ftbl"); return SIGIL_FALSE; } sp_ftbl *ft = (sp_ftbl *)sigil_foreign_get_data(args[0]); sp_gen_sine(g_sp, ft); return SIGIL_NIL;}/* (ftbl-gen-triangle ftbl) */static Value native_ftbl_gen_triangle(SigilVM *vm, int argc, Value *args){ CHECK_SP(vm, "ftbl-gen-triangle"); ENSURE_TAG(vm, tt_ftbl, "dsp-ftbl"); if (!sigil_is_foreign_type(args[0], tt_ftbl)) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "ftbl-gen-triangle: expected ftbl"); return SIGIL_FALSE; } sp_ftbl *ft = (sp_ftbl *)sigil_foreign_get_data(args[0]); sp_gen_triangle(g_sp, ft); return SIGIL_NIL;}/* (ftbl-gen-line ftbl argstring) */static Value native_ftbl_gen_line(SigilVM *vm, int argc, Value *args){ CHECK_SP(vm, "ftbl-gen-line"); ENSURE_TAG(vm, tt_ftbl, "dsp-ftbl"); if (!sigil_is_foreign_type(args[0], tt_ftbl)) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "ftbl-gen-line: expected ftbl"); return SIGIL_FALSE; } if (!sigil_is_string(args[1])) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "ftbl-gen-line: expected string"); return SIGIL_FALSE; } sp_ftbl *ft = (sp_ftbl *)sigil_foreign_get_data(args[0]); SigilString *s = (SigilString *)sigil_as_ptr(args[1]); sp_gen_line(g_sp, ft, s->data); return SIGIL_NIL;}/* ============================================================ * OSCILLATORS * ============================================================ *//* (make-osc freq amp [phase]) -> <osc> * Wavetable oscillator with sine wave table */static Value native_make_osc(SigilVM *vm, int argc, Value *args){ CHECK_SP(vm, "make-osc"); SPFLOAT freq = (SPFLOAT)sigil_as_flonum(args[0]); SPFLOAT amp = (SPFLOAT)sigil_as_flonum(args[1]); SPFLOAT phase = argc > 2 ? (SPFLOAT)sigil_as_flonum(args[2]) : 0.0f; sp_ftbl *ft; sp_ftbl_create(g_sp, &ft, 4096); sp_gen_sine(g_sp, ft); sp_osc *osc; sp_osc_create(&osc); sp_osc_init(g_sp, osc, ft, phase); osc->freq = freq; osc->amp = amp; dsp_osc *d = malloc(sizeof(dsp_osc)); d->osc = osc; d->ft = ft; ENSURE_TAG(vm, tt_osc, "dsp-osc"); return sigil_make_foreign(vm, tt_osc, d, destroy_osc, sizeof(dsp_osc) + sizeof(sp_osc) + 4096 * sizeof(SPFLOAT));}/* (make-osc-ft ftbl freq amp [phase]) -> <osc> * Wavetable oscillator with custom function table */static Value native_make_osc_ft(SigilVM *vm, int argc, Value *args){ CHECK_SP(vm, "make-osc-ft"); ENSURE_TAG(vm, tt_ftbl, "dsp-ftbl"); if (!sigil_is_foreign_type(args[0], tt_ftbl)) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "make-osc-ft: expected ftbl as first argument"); return SIGIL_FALSE; } /* Note: the ftbl is NOT owned by this osc — caller manages its lifetime */ sp_ftbl *ft = (sp_ftbl *)sigil_foreign_get_data(args[0]); SPFLOAT freq = (SPFLOAT)sigil_as_flonum(args[1]); SPFLOAT amp = (SPFLOAT)sigil_as_flonum(args[2]); SPFLOAT phase = argc > 3 ? (SPFLOAT)sigil_as_flonum(args[3]) : 0.0f; sp_osc *osc; sp_osc_create(&osc); sp_osc_init(g_sp, osc, ft, phase); osc->freq = freq; osc->amp = amp; dsp_osc *d = malloc(sizeof(dsp_osc)); d->osc = osc; d->ft = NULL; /* not owned */ ENSURE_TAG(vm, tt_osc, "dsp-osc"); return sigil_make_foreign(vm, tt_osc, d, destroy_osc, sizeof(dsp_osc) + sizeof(sp_osc));}/* (osc-compute osc) -> flonum */static Value native_osc_compute(SigilVM *vm, int argc, Value *args){ dsp_osc *d = get_osc(vm, args[0]); if (!d) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "osc-compute: expected osc"); return SIGIL_FALSE; } SPFLOAT in = 0, out = 0; sp_osc_compute(g_sp, d->osc, &in, &out); return sigil_flonum((double)out);}/* (osc-set-freq! osc freq) */static Value native_osc_set_freq(SigilVM *vm, int argc, Value *args){ dsp_osc *d = get_osc(vm, args[0]); if (!d) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "osc-set-freq!: expected osc"); return SIGIL_FALSE; } d->osc->freq = (SPFLOAT)sigil_as_flonum(args[1]); return SIGIL_NIL;}/* (osc-set-amp! osc amp) */static Value native_osc_set_amp(SigilVM *vm, int argc, Value *args){ dsp_osc *d = get_osc(vm, args[0]); if (!d) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "osc-set-amp!: expected osc"); return SIGIL_FALSE; } d->osc->amp = (SPFLOAT)sigil_as_flonum(args[1]); return SIGIL_NIL;}/* (make-posc3 freq amp [phase]) -> <posc3> */static Value native_make_posc3(SigilVM *vm, int argc, Value *args){ CHECK_SP(vm, "make-posc3"); SPFLOAT freq = (SPFLOAT)sigil_as_flonum(args[0]); SPFLOAT amp = (SPFLOAT)sigil_as_flonum(args[1]); sp_ftbl *ft; sp_ftbl_create(g_sp, &ft, 4096); sp_gen_sine(g_sp, ft); sp_posc3 *osc; sp_posc3_create(&osc); sp_posc3_init(g_sp, osc, ft); osc->freq = freq; osc->amp = amp; dsp_posc3 *d = malloc(sizeof(dsp_posc3)); d->osc = osc; d->ft = ft; ENSURE_TAG(vm, tt_posc3, "dsp-posc3"); return sigil_make_foreign(vm, tt_posc3, d, destroy_posc3, sizeof(dsp_posc3) + sizeof(sp_posc3) + 4096 * sizeof(SPFLOAT));}/* (posc3-compute osc) -> flonum */static Value native_posc3_compute(SigilVM *vm, int argc, Value *args){ dsp_posc3 *d = get_posc3(vm, args[0]); if (!d) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "posc3-compute: expected posc3"); return SIGIL_FALSE; } SPFLOAT in = 0, out = 0; sp_posc3_compute(g_sp, d->osc, &in, &out); return sigil_flonum((double)out);}/* (posc3-set-freq! osc freq) */static Value native_posc3_set_freq(SigilVM *vm, int argc, Value *args){ dsp_posc3 *d = get_posc3(vm, args[0]); if (!d) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "posc3-set-freq!: expected posc3"); return SIGIL_FALSE; } d->osc->freq = (SPFLOAT)sigil_as_flonum(args[1]); return SIGIL_NIL;}/* (posc3-set-amp! osc amp) */static Value native_posc3_set_amp(SigilVM *vm, int argc, Value *args){ dsp_posc3 *d = get_posc3(vm, args[0]); if (!d) { sigil__vm_set_error(vm, SIGIL_ERR_TYPE, "posc3-set-amp!: expected posc3"); return SIGIL_FALSE; } d->osc->amp = (SPFLOAT)sigil_as_flonum(args[1]); return SIGIL_NIL;}/* (make-blsaw freq amp) -> <blsaw> */static Value native_make_blsaw(SigilVM *vm, int argc, Value *args){ CHECK_SP(vm, "make-blsaw"); SPFLOAT freq = (SPFLOAT)sigil_as_flonum(args[0]); SPFLOAT amp = (SPFLOAT)sigil_as_flonum(args[1]); sp_blsaw *p; sp_blsaw_create(&p); sp_blsaw_init(g_sp, p); *p->freq = freq; *p->amp = amp; ENSURE_TAG(vm, tt_blsaw, "dsp-blsaw"); return sigil_make_foreign(vm, tt_blsaw, p, destroy_blsaw, sizeof(sp_blsaw));}/* (blsaw-compute osc) -> flonum */static Value native_blsaw_compute(SigilVM *vm, int argc, Value *args)Showing the first 500 of 1999 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
src/sigil/dsp/core.sgladded
;;; (sigil dsp core) - DSP engine lifecycle and function tables;;;;;; Initialize the DSP engine before using any other dsp modules.;;;;;; ```scheme;;; (import (sigil dsp core));;; (dsp-init 44100);;; (dsp-sample-rate) ; => 44100;;; (dsp-shutdown);;; ```(define-library (sigil dsp core) (export dsp-init dsp-shutdown dsp-sample-rate make-ftbl ftbl-gen-sine ftbl-gen-triangle ftbl-gen-line) (begin (define-native dsp-init) (define-native (dsp-shutdown)) (define-native (dsp-sample-rate)) (define-native (make-ftbl size)) (define-native (ftbl-gen-sine ft)) (define-native (ftbl-gen-triangle ft)) (define-native (ftbl-gen-line ft argstring))))src/sigil/dsp/env.sgladded
;;; (sigil dsp env) - Envelopes;;;;;; ADSR, triggered envelopes, line segments, exponential curves, portamento.;;;;;; ```scheme;;; (import (sigil dsp core) (sigil dsp env));;; (dsp-init);;; (define env (make-adsr 0.01 0.1 0.7 0.3));;; (adsr-compute env 1.0) ; gate on => envelope value;;; ```(define-library (sigil dsp env) (export make-adsr adsr-compute make-tadsr tadsr-compute make-tenv tenv-compute make-line line-compute make-expon expon-compute make-port port-compute) (begin (define-native (make-adsr atk dec sus rel)) (define-native (adsr-compute adsr gate)) (define-native (make-tadsr atk dec sus rel)) (define-native (tadsr-compute tadsr trigger)) (define-native (make-tenv atk hold rel)) (define-native (tenv-compute tenv trigger)) (define-native (make-line a dur b)) (define-native (line-compute line trigger)) (define-native (make-expon a dur b)) (define-native (expon-compute expon trigger)) (define-native (make-port smoothing)) (define-native (port-compute port input))))src/sigil/dsp/filter.sgladded
;;; (sigil dsp filter) - Filters;;;;;; Lowpass, highpass, resonant, and DC blocking filters.;;;;;; ```scheme;;; (import (sigil dsp core) (sigil dsp filter));;; (dsp-init);;; (define filt (make-filter 'moogladder 1000.0 0.4));;; (filter-compute filt 0.5) ; => filtered sample;;; ```(define-library (sigil dsp filter) (export make-filter make-moogladder make-butlp make-buthp make-lpf18 make-tone make-atone make-dcblock filter-compute filter-set-freq! filter-set-res!) (begin (define-native (make-moogladder freq res)) (define-native (make-butlp freq)) (define-native (make-buthp freq)) (define-native (make-lpf18 cutoff res dist)) (define-native (make-tone freq)) (define-native (make-atone freq)) (define-native (make-dcblock)) (define-native (filter-compute filter input)) (define-native (filter-set-freq! filter freq)) (define-native (filter-set-res! filter res)) ;;; Create a filter by type. ;;; Types: moogladder, butlp, buthp, lpf18, tone, atone, dcblock (define (make-filter type . args) (case type ((moogladder) (apply make-moogladder args)) ((butlp) (apply make-butlp args)) ((buthp) (apply make-buthp args)) ((lpf18) (apply make-lpf18 args)) ((tone) (apply make-tone args)) ((atone) (apply make-atone args)) ((dcblock) (make-dcblock)) (else (error "make-filter: unknown type" type))))))src/sigil/dsp/fx.sgladded
;;; (sigil dsp fx) - Effects;;;;;; Reverb and delay effects.;;;;;; ```scheme;;; (import (sigil dsp core) (sigil dsp fx));;; (dsp-init);;; (define rev (make-revsc 0.97 10000.0));;; (revsc-compute rev 0.5 0.5) ; => (left . right);;; ```(define-library (sigil dsp fx) (export make-revsc revsc-compute revsc-set-feedback! revsc-set-lpfreq! make-zitarev zitarev-compute zitarev-set-mix! zitarev-set-level! make-delay delay-compute delay-set-feedback! make-vdelay vdelay-compute vdelay-set-del! vdelay-set-feedback!) (begin (define-native (make-revsc feedback lpfreq)) (define-native (revsc-compute revsc in-left in-right)) (define-native (revsc-set-feedback! revsc feedback)) (define-native (revsc-set-lpfreq! revsc lpfreq)) (define-native (make-zitarev)) (define-native (zitarev-compute zitarev in-left in-right)) (define-native (zitarev-set-mix! zitarev mix)) (define-native (zitarev-set-level! zitarev level)) (define-native (make-delay time feedback)) (define-native (delay-compute delay input)) (define-native (delay-set-feedback! delay feedback)) (define-native (make-vdelay maxdel feedback)) (define-native (vdelay-compute vdelay input)) (define-native (vdelay-set-del! vdelay del)) (define-native (vdelay-set-feedback! vdelay feedback))))src/sigil/dsp/noise.sgladded
;;; (sigil dsp noise) - Noise generators;;;;;; White, pink, and brown noise.;;;;;; ```scheme;;; (import (sigil dsp core) (sigil dsp noise));;; (dsp-init);;; (define n (make-noise 0.5));;; (noise-compute n) ; => random sample;;; ```(define-library (sigil dsp noise) (export make-noise noise-compute make-pinknoise pinknoise-compute make-brown brown-compute) (begin (define-native (make-noise amp)) (define-native (noise-compute noise)) (define-native (make-pinknoise amp)) (define-native (pinknoise-compute pinknoise)) (define-native (make-brown)) (define-native (brown-compute brown))))src/sigil/dsp/osc.sgladded
;;; (sigil dsp osc) - Oscillators;;;;;; Wavetable, bandlimited, FM, and phase oscillators.;;;;;; ```scheme;;; (import (sigil dsp core) (sigil dsp osc));;; (dsp-init);;; (define osc (make-oscillator 'sine 440.0 0.5));;; (osc-compute osc) ; => one sample;;; ```(define-library (sigil dsp osc) (export make-oscillator make-osc make-osc-ft osc-compute osc-set-freq! osc-set-amp! make-posc3 posc3-compute posc3-set-freq! posc3-set-amp! make-blsaw blsaw-compute blsaw-set-freq! blsaw-set-amp! make-blsquare blsquare-compute blsquare-set-freq! blsquare-set-amp! make-bltriangle bltriangle-compute bltriangle-set-freq! bltriangle-set-amp! make-fosc fosc-compute fosc-set-freq! fosc-set-index! fosc-set-amp! make-phasor phasor-compute phasor-set-freq!) (begin (define-native make-osc) (define-native make-osc-ft) (define-native (osc-compute osc)) (define-native (osc-set-freq! osc freq)) (define-native (osc-set-amp! osc amp)) (define-native make-posc3) (define-native (posc3-compute osc)) (define-native (posc3-set-freq! osc freq)) (define-native (posc3-set-amp! osc amp)) (define-native (make-blsaw freq amp)) (define-native (blsaw-compute osc)) (define-native (blsaw-set-freq! osc freq)) (define-native (blsaw-set-amp! osc amp)) (define-native make-blsquare) (define-native (blsquare-compute osc)) (define-native (blsquare-set-freq! osc freq)) (define-native (blsquare-set-amp! osc amp)) (define-native (make-bltriangle freq amp)) (define-native (bltriangle-compute osc)) (define-native (bltriangle-set-freq! osc freq)) (define-native (bltriangle-set-amp! osc amp)) (define-native (make-fosc freq car mod indx amp)) (define-native (fosc-compute osc)) (define-native (fosc-set-freq! osc freq)) (define-native (fosc-set-index! osc indx)) (define-native (fosc-set-amp! osc amp)) (define-native make-phasor) (define-native (phasor-compute phasor)) (define-native (phasor-set-freq! phasor freq)) ;;; Create an oscillator by type. ;;; Types: sine, saw, square, triangle, fm (define (make-oscillator type freq amp . opts) (case type ((sine) (make-osc freq amp)) ((saw) (make-blsaw freq amp)) ((square) (if (null? opts) (make-blsquare freq amp) (make-blsquare freq amp (car opts)))) ((triangle) (make-bltriangle freq amp)) ((fm) (if (>= (length opts) 2) (make-fosc freq (car opts) (cadr opts) (if (>= (length opts) 3) (caddr opts) 1.0) amp) (error "make-oscillator: fm requires car and mod ratios" opts))) (else (error "make-oscillator: unknown type" type))))))src/sigil/dsp/test-main.sgladded
;;; Test entry point for sigil-dsp(define-library (sigil dsp test-main) (import (sigil core) (sigil dsp core) (sigil dsp osc) (sigil dsp filter) (sigil dsp env) (sigil dsp fx) (sigil dsp noise) (sigil dsp util)) (export main) (begin (define (main . args) (display "=== sigil-dsp tests ===\n\n") ;; Core (dsp-init 44100) (display (string-append "Sample rate: " (number->string (dsp-sample-rate)) "\n")) ;; Oscillator (display "\n--- Oscillators ---\n") (let ((osc (make-osc 440.0 1.0))) (let ((s (osc-compute osc))) (display (string-append " Sine: " (number->string s) "\n")))) (let ((saw (make-blsaw 220.0 0.8))) (blsaw-compute saw) (blsaw-compute saw) (display (string-append " Saw: " (number->string (blsaw-compute saw)) "\n"))) (let ((fm (make-fosc 440.0 1.0 2.0 5.0 0.6))) (display (string-append " FM: " (number->string (fosc-compute fm)) "\n"))) ;; Filter (display "\n--- Filters ---\n") (let ((filt (make-moogladder 1000.0 0.4))) (display (string-append " Moogladder: " (number->string (filter-compute filt 0.5)) "\n"))) ;; Envelope (display "\n--- Envelopes ---\n") (let ((env (make-adsr 0.01 0.1 0.7 0.3))) (display (string-append " ADSR: " (number->string (adsr-compute env 1.0)) "\n"))) ;; Reverb (display "\n--- Effects ---\n") (let ((rev (make-revsc 0.97 10000.0))) (let ((r (revsc-compute rev 0.5 0.5))) (display (string-append " Reverb L: " (number->string (car r)) " R: " (number->string (cdr r)) "\n")))) ;; Noise (display "\n--- Noise ---\n") (let ((n (make-noise 1.0))) (display (string-append " White: " (number->string (noise-compute n)) "\n"))) ;; Utility (display "\n--- Utility ---\n") (let ((pan (make-pan2 0.3))) (let ((r (pan2-compute pan 0.8))) (display (string-append " Pan L: " (number->string (car r)) " R: " (number->string (cdr r)) "\n")))) ;; Metro (let ((met (make-metro 2.0))) (let loop ((i 0) (triggers 0)) (if (> i 44100) (display (string-append " Metro triggers: " (number->string triggers) "\n")) (let ((val (metro-compute met))) (loop (+ i 1) (if (> val 0.0) (+ triggers 1) triggers)))))) (dsp-shutdown) (display "\n=== All tests passed! ===\n"))))src/sigil/dsp/util.sgladded
;;; (sigil dsp util) - Utility DSP modules;;;;;; Dynamics, panning, timing, random modulation, scaling, and WAV output.(define-library (sigil dsp util) (export make-saturator saturator-compute make-clip clip-compute make-peaklim peaklim-compute make-pan2 pan2-compute pan2-set-pan! make-metro metro-compute metro-set-freq! make-clock clock-compute clock-set-bpm! make-tgate tgate-compute make-randh randh-compute make-randi randi-compute make-scale scale-compute make-clamp clamp-compute make-crossfade crossfade-compute crossfade-set-pos! make-wavout wavout-compute) (begin (define-native (make-saturator drive dcoffset)) (define-native (saturator-compute saturator input)) (define-native (make-clip limit)) (define-native (clip-compute clip input)) (define-native (make-peaklim atk rel thresh)) (define-native (peaklim-compute peaklim input)) (define-native make-pan2) (define-native (pan2-compute pan2 input)) (define-native (pan2-set-pan! pan2 pan)) (define-native (make-metro freq)) (define-native (metro-compute metro)) (define-native (metro-set-freq! metro freq)) (define-native (make-clock bpm subdiv)) (define-native (clock-compute clock trigger)) (define-native (clock-set-bpm! clock bpm)) (define-native (make-tgate time)) (define-native (tgate-compute tgate trigger)) (define-native (make-randh min max freq)) (define-native (randh-compute randh)) (define-native (make-randi min max freq)) (define-native (randi-compute randi)) (define-native (make-scale min max)) (define-native (scale-compute scale input)) (define-native (make-clamp min max)) (define-native (clamp-compute clamp input)) (define-native make-crossfade) (define-native (crossfade-compute crossfade in1 in2)) (define-native (crossfade-set-pos! crossfade pos)) (define-native (make-wavout filename)) (define-native (wavout-compute wavout sample))))test/basic-test.sgladded
(import (sigil dsp core))(dsp-init)(display (dsp-sample-rate))(newline)(dsp-shutdown)vendor/soundpipe/h/adsr.hadded
typedef struct { SPFLOAT atk; SPFLOAT dec; SPFLOAT sus; SPFLOAT rel; uint32_t timer; uint32_t atk_time; SPFLOAT a; SPFLOAT b; SPFLOAT y; SPFLOAT x; SPFLOAT prev; int mode;} sp_adsr;int sp_adsr_create(sp_adsr **p);int sp_adsr_destroy(sp_adsr **p);int sp_adsr_init(sp_data *sp, sp_adsr *p);int sp_adsr_compute(sp_data *sp, sp_adsr *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/atone.hadded
typedef struct { SPFLOAT hp; SPFLOAT c1, c2, yt1, prvhp; SPFLOAT tpidsr;} sp_atone;int sp_atone_create(sp_atone **p);int sp_atone_destroy(sp_atone **p);int sp_atone_init(sp_data *sp, sp_atone *p);int sp_atone_compute(sp_data *sp, sp_atone *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/base.hadded
#include <stdint.h>#include <stdio.h>#define SP_BUFSIZE 4096#ifndef SPFLOAT#define SPFLOAT float#endif#define SP_OK 1#define SP_NOT_OK 0#define SP_RANDMAX 2147483648typedef unsigned long sp_frame;typedef struct sp_auxdata { size_t size; void *ptr;} sp_auxdata;typedef struct sp_data { SPFLOAT *out; int sr; int nchan; unsigned long len; unsigned long pos; char filename[200]; uint32_t rand;} sp_data;typedef struct { char state; SPFLOAT val;} sp_param;int sp_auxdata_alloc(sp_auxdata *aux, size_t size);int sp_auxdata_free(sp_auxdata *aux);int sp_create(sp_data **spp);int sp_createn(sp_data **spp, int nchan);int sp_destroy(sp_data **spp);int sp_process(sp_data *sp, void *ud, void (*callback)(sp_data *, void *));int sp_process_raw(sp_data *sp, void *ud, void (*callback)(sp_data *, void *));int sp_process_plot(sp_data *sp, void *ud, void (*callback)(sp_data *, void *));int sp_process_spa(sp_data *sp, void *ud, void (*callback)(sp_data *, void *));SPFLOAT sp_midi2cps(SPFLOAT nn);int sp_set(sp_param *p, SPFLOAT val);int sp_out(sp_data *sp, uint32_t chan, SPFLOAT val);uint32_t sp_rand(sp_data *sp);void sp_srand(sp_data *sp, uint32_t val);typedef struct { SPFLOAT *utbl; int16_t *BRLow; int16_t *BRLowCpx;} sp_fft;void sp_fft_create(sp_fft **fft);void sp_fft_init(sp_fft *fft, int M);void sp_fftr(sp_fft *fft, SPFLOAT *buf, int FFTsize);void sp_fft_cpx(sp_fft *fft, SPFLOAT *buf, int FFTsize);void sp_ifftr(sp_fft *fft, SPFLOAT *buf, int FFTsize);void sp_fft_destroy(sp_fft *fft);#ifndef kiss_fft_scalar#define kiss_fft_scalar SPFLOAT#endiftypedef struct { kiss_fft_scalar r; kiss_fft_scalar i;}kiss_fft_cpx;typedef struct kiss_fft_state* kiss_fft_cfg;typedef struct kiss_fftr_state* kiss_fftr_cfg;/* SPA: Soundpipe Audio */enum { SPA_READ, SPA_WRITE, SPA_NULL };typedef struct { char magic; char nchan; uint16_t sr; uint32_t len;} spa_header;typedef struct { spa_header header; size_t offset; int mode; FILE *fp; uint32_t pos;} sp_audio;vendor/soundpipe/h/blsaw.hadded
typedef struct { void *ud; int argpos; SPFLOAT *args[2]; SPFLOAT *freq; SPFLOAT *amp;} sp_blsaw;int sp_blsaw_create(sp_blsaw **p);int sp_blsaw_destroy(sp_blsaw **p);int sp_blsaw_init(sp_data *sp, sp_blsaw *p);int sp_blsaw_compute(sp_data *sp, sp_blsaw *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/blsquare.hadded
typedef struct { void *ud; int argpos; SPFLOAT *args[3]; SPFLOAT *freq; SPFLOAT *amp; SPFLOAT *width;} sp_blsquare;int sp_blsquare_create(sp_blsquare **p);int sp_blsquare_destroy(sp_blsquare **p);int sp_blsquare_init(sp_data *sp, sp_blsquare *p);int sp_blsquare_compute(sp_data *sp, sp_blsquare *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/bltriangle.hadded
typedef struct { void *ud; int argpos; SPFLOAT *args[2]; SPFLOAT *freq; SPFLOAT *amp;} sp_bltriangle;int sp_bltriangle_create(sp_bltriangle **p);int sp_bltriangle_destroy(sp_bltriangle **p);int sp_bltriangle_init(sp_data *sp, sp_bltriangle *p);int sp_bltriangle_compute(sp_data *sp, sp_bltriangle *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/brown.hadded
typedef struct { SPFLOAT brown;} sp_brown;int sp_brown_create(sp_brown **p);int sp_brown_destroy(sp_brown **p);int sp_brown_init(sp_data *sp, sp_brown *p);int sp_brown_compute(sp_data *sp, sp_brown *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/buthp.hadded
typedef struct { SPFLOAT freq; SPFLOAT lfreq; SPFLOAT a[7]; SPFLOAT pidsr;} sp_buthp;int sp_buthp_create(sp_buthp **p);int sp_buthp_destroy(sp_buthp **p);int sp_buthp_init(sp_data *sp, sp_buthp *p);int sp_buthp_compute(sp_data *sp, sp_buthp *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/butlp.hadded
typedef struct { SPFLOAT sr, freq; SPFLOAT lfreq; SPFLOAT a[7]; SPFLOAT pidsr;} sp_butlp;int sp_butlp_create(sp_butlp **p);int sp_butlp_destroy(sp_butlp **p);int sp_butlp_init(sp_data *sp, sp_butlp *p);int sp_butlp_compute(sp_data *sp, sp_butlp *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/clamp.hadded
typedef struct { SPFLOAT min; SPFLOAT max;} sp_clamp;int sp_clamp_create(sp_clamp **p);int sp_clamp_destroy(sp_clamp **p);int sp_clamp_init(sp_data *sp, sp_clamp *p);int sp_clamp_compute(sp_data *sp, sp_clamp *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/clip.hadded
typedef struct{ SPFLOAT lim, k1;}sp_clip;int sp_clip_create(sp_clip **p);int sp_clip_destroy(sp_clip **p);int sp_clip_init(sp_data *sp, sp_clip *p);int sp_clip_compute(sp_data *sp, sp_clip *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/clock.hadded
typedef struct { SPFLOAT bpm; SPFLOAT subdiv; uint32_t counter;} sp_clock;int sp_clock_create(sp_clock **p);int sp_clock_destroy(sp_clock **p);int sp_clock_init(sp_data *sp, sp_clock *p);int sp_clock_compute(sp_data *sp, sp_clock *p, SPFLOAT *trig, SPFLOAT *out);vendor/soundpipe/h/crossfade.hadded
typedef struct { SPFLOAT pos;} sp_crossfade;int sp_crossfade_create(sp_crossfade **p);int sp_crossfade_destroy(sp_crossfade **p);int sp_crossfade_init(sp_data *sp, sp_crossfade *p);int sp_crossfade_compute(sp_data *sp, sp_crossfade *p, SPFLOAT *in1, SPFLOAT *in2, SPFLOAT *out);vendor/soundpipe/h/dcblock.hadded
typedef struct { SPFLOAT gg; SPFLOAT outputs; SPFLOAT inputs; SPFLOAT gain;} sp_dcblock;int sp_dcblock_create(sp_dcblock **p);int sp_dcblock_destroy(sp_dcblock **p);int sp_dcblock_init(sp_data *sp, sp_dcblock *p);int sp_dcblock_compute(sp_data *sp, sp_dcblock *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/delay.hadded
typedef struct { SPFLOAT time; SPFLOAT feedback; SPFLOAT last; sp_auxdata buf; uint32_t bufsize; uint32_t bufpos;} sp_delay;int sp_delay_create(sp_delay **p);int sp_delay_destroy(sp_delay **p);int sp_delay_init(sp_data *sp, sp_delay *p, SPFLOAT time);int sp_delay_compute(sp_data *sp, sp_delay *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/expon.hadded
typedef struct { SPFLOAT a, dur, b; SPFLOAT val, incr; uint32_t sdur, stime; int init;} sp_expon;int sp_expon_create(sp_expon **p);int sp_expon_destroy(sp_expon **p);int sp_expon_init(sp_data *sp, sp_expon *p);int sp_expon_compute(sp_data *sp, sp_expon *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/fosc.hadded
typedef struct sp_fosc{ SPFLOAT amp, freq, car, mod, indx, iphs; int32_t mphs, cphs; sp_ftbl *ft;} sp_fosc;int sp_fosc_create(sp_fosc **p);int sp_fosc_destroy(sp_fosc **p);int sp_fosc_init(sp_data *sp, sp_fosc *p, sp_ftbl *ft);int sp_fosc_compute(sp_data *sp, sp_fosc *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/ftbl.hadded
#define SP_FT_MAXLEN 0x1000000L#define SP_FT_PHMASK 0x0FFFFFFLtypedef struct sp_ftbl{ size_t size; uint32_t lobits; uint32_t lomask; SPFLOAT lodiv; SPFLOAT sicvt; SPFLOAT *tbl; char del;}sp_ftbl;int sp_ftbl_create(sp_data *sp, sp_ftbl **ft, size_t size);int sp_ftbl_init(sp_data *sp, sp_ftbl *ft, size_t size);int sp_ftbl_bind(sp_data *sp, sp_ftbl **ft, SPFLOAT *tbl, size_t size);int sp_ftbl_destroy(sp_ftbl **ft);int sp_gen_vals(sp_data *sp, sp_ftbl *ft, const char *string);int sp_gen_sine(sp_data *sp, sp_ftbl *ft);int sp_gen_file(sp_data *sp, sp_ftbl *ft, const char *filename);int sp_gen_sinesum(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_line(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_xline(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_gauss(sp_data *sp, sp_ftbl *ft, SPFLOAT scale, uint32_t seed);int sp_ftbl_loadfile(sp_data *sp, sp_ftbl **ft, const char *filename);int sp_ftbl_loadspa(sp_data *sp, sp_ftbl **ft, const char *filename);int sp_gen_composite(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_rand(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_triangle(sp_data *sp, sp_ftbl *ft);vendor/soundpipe/h/line.hadded
typedef struct { SPFLOAT a, dur, b; SPFLOAT val, incr; uint32_t sdur, stime; int init;} sp_line;int sp_line_create(sp_line **p);int sp_line_destroy(sp_line **p);int sp_line_init(sp_data *sp, sp_line *p);int sp_line_compute(sp_data *sp, sp_line *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/lpf18.hadded
typedef struct sp_lpf18{ SPFLOAT cutoff, res, dist; SPFLOAT ay1, ay2, aout, lastin, onedsr;} sp_lpf18;int sp_lpf18_create(sp_lpf18 **p);int sp_lpf18_destroy(sp_lpf18 **p);int sp_lpf18_init(sp_data *sp, sp_lpf18 *p);int sp_lpf18_compute(sp_data *sp, sp_lpf18 *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/metro.hadded
typedef struct sp_metro{ SPFLOAT freq; SPFLOAT phs; int init; SPFLOAT onedsr;} sp_metro;int sp_metro_create(sp_metro **p);int sp_metro_destroy(sp_metro **p);int sp_metro_init(sp_data *sp, sp_metro *p);int sp_metro_compute(sp_data *sp, sp_metro *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/moogladder.hadded
typedef struct { SPFLOAT freq; SPFLOAT res; SPFLOAT istor; SPFLOAT delay[6]; SPFLOAT tanhstg[3]; SPFLOAT oldfreq; SPFLOAT oldres; SPFLOAT oldacr; SPFLOAT oldtune;} sp_moogladder;int sp_moogladder_create(sp_moogladder **t);int sp_moogladder_destroy(sp_moogladder **t);int sp_moogladder_init(sp_data *sp, sp_moogladder *p);int sp_moogladder_compute(sp_data *sp, sp_moogladder *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/noise.hadded
typedef struct{ SPFLOAT amp;}sp_noise;int sp_noise_create(sp_noise **ns);int sp_noise_init(sp_data *sp, sp_noise *ns);int sp_noise_compute(sp_data *sp, sp_noise *ns, SPFLOAT *in, SPFLOAT *out);int sp_noise_destroy(sp_noise **ns);vendor/soundpipe/h/osc.hadded
typedef struct { SPFLOAT freq, amp, iphs; int32_t lphs; sp_ftbl *tbl; int inc;} sp_osc;int sp_osc_create(sp_osc **osc);int sp_osc_destroy(sp_osc **osc);int sp_osc_init(sp_data *sp, sp_osc *osc, sp_ftbl *ft, SPFLOAT iphs);int sp_osc_compute(sp_data *sp, sp_osc *osc, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/pan2.hadded
typedef struct { SPFLOAT pan; uint32_t type;} sp_pan2;int sp_pan2_create(sp_pan2 **p);int sp_pan2_destroy(sp_pan2 **p);int sp_pan2_init(sp_data *sp, sp_pan2 *p);int sp_pan2_compute(sp_data *sp, sp_pan2 *p, SPFLOAT *in, SPFLOAT *out1, SPFLOAT *out2);vendor/soundpipe/h/peaklim.hadded
typedef struct { SPFLOAT atk, rel, thresh; SPFLOAT patk, prel; SPFLOAT b0_r, a1_r, b0_a, a1_a, level;} sp_peaklim;int sp_peaklim_create(sp_peaklim **p);int sp_peaklim_destroy(sp_peaklim **p);int sp_peaklim_init(sp_data *sp, sp_peaklim *p);int sp_peaklim_compute(sp_data *sp, sp_peaklim *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/phasor.hadded
typedef struct sp_phasor{ SPFLOAT freq, phs; SPFLOAT onedsr;} sp_phasor;int sp_phasor_create(sp_phasor **p);int sp_phasor_destroy(sp_phasor **p);int sp_phasor_init(sp_data *sp, sp_phasor *p, SPFLOAT iphs);int sp_phasor_compute(sp_data *sp, sp_phasor *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/pinknoise.hadded
typedef struct { SPFLOAT amp; unsigned int newrand; unsigned int prevrand; unsigned int k; unsigned int seed; unsigned int total; uint32_t counter; unsigned int dice[7];} sp_pinknoise;int sp_pinknoise_create(sp_pinknoise **p);int sp_pinknoise_destroy(sp_pinknoise **p);int sp_pinknoise_init(sp_data *sp, sp_pinknoise *p);int sp_pinknoise_compute(sp_data *sp, sp_pinknoise *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/port.hadded
typedef struct{ SPFLOAT smooth; SPFLOAT a1, b0, y0, psmooth; SPFLOAT onedsr;}sp_port;int sp_port_create(sp_port **p);int sp_port_destroy(sp_port **p);int sp_port_init(sp_data *sp, sp_port *p);int sp_port_compute(sp_data *sp, sp_port *p, SPFLOAT *in, SPFLOAT *out);int sp_port_reset(sp_data *sp, sp_port *p, SPFLOAT *in);vendor/soundpipe/h/posc3.hadded
typedef struct { SPFLOAT freq, amp, iphs; sp_ftbl *tbl; int32_t tablen; SPFLOAT tablenUPsr; SPFLOAT phs; SPFLOAT onedsr;} sp_posc3;int sp_posc3_create(sp_posc3 **posc3);int sp_posc3_destroy(sp_posc3 **posc3);int sp_posc3_init(sp_data *sp, sp_posc3 *posc3, sp_ftbl *ft);int sp_posc3_compute(sp_data *sp, sp_posc3 *posc3, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/randh.hadded
typedef struct { SPFLOAT freq; SPFLOAT min, max; SPFLOAT val; uint32_t counter, dur;} sp_randh;int sp_randh_create(sp_randh **p);int sp_randh_destroy(sp_randh **p);int sp_randh_init(sp_data *sp, sp_randh *p);int sp_randh_compute(sp_data *sp, sp_randh *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/randi.hadded
typedef struct { SPFLOAT min, max, cps, mode, fstval; int16_t cpscod; int32_t phs; SPFLOAT num1, num2, dfdmax; int holdrand; SPFLOAT sicvt;} sp_randi;int sp_randi_create(sp_randi **p);int sp_randi_destroy(sp_randi **p);int sp_randi_init(sp_data *sp, sp_randi *p);int sp_randi_compute(sp_data *sp, sp_randi *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/randmt.hadded
typedef struct { int mti; /* do not change value 624 */ uint32_t mt[624];} sp_randmt;void sp_randmt_seed(sp_randmt *p, const uint32_t *initKey, uint32_t keyLength);uint32_t sp_randmt_compute(sp_randmt *p);vendor/soundpipe/h/revsc.hadded
typedef struct { int writePos; int bufferSize; int readPos; int readPosFrac; int readPosFrac_inc; int dummy; int seedVal; int randLine_cnt; SPFLOAT filterState; SPFLOAT *buf;} sp_revsc_dl;typedef struct { SPFLOAT feedback, lpfreq; SPFLOAT iSampleRate, iPitchMod, iSkipInit; SPFLOAT sampleRate; SPFLOAT dampFact; SPFLOAT prv_LPFreq; int initDone; sp_revsc_dl delayLines[8]; sp_auxdata aux;} sp_revsc;int sp_revsc_create(sp_revsc **p);int sp_revsc_destroy(sp_revsc **p);int sp_revsc_init(sp_data *sp, sp_revsc *p);int sp_revsc_compute(sp_data *sp, sp_revsc *p, SPFLOAT *in1, SPFLOAT *in2, SPFLOAT *out1, SPFLOAT *out2);vendor/soundpipe/h/saturator.hadded
typedef struct{ SPFLOAT drive; SPFLOAT dcoffset; SPFLOAT dcblocker[2][7]; SPFLOAT ai[6][7]; SPFLOAT aa[6][7];} sp_saturator;int sp_saturator_create(sp_saturator **p);int sp_saturator_destroy(sp_saturator **p);int sp_saturator_init(sp_data *sp, sp_saturator *p);int sp_saturator_compute(sp_data *sp, sp_saturator *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/scale.hadded
typedef struct { SPFLOAT min, max;} sp_scale;int sp_scale_create(sp_scale **p);int sp_scale_destroy(sp_scale **p);int sp_scale_init(sp_data *sp, sp_scale *p);int sp_scale_compute(sp_data *sp, sp_scale *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/soundpipe.hadded
#ifndef SOUNDPIPE_H#define SOUNDPIPE_H#include <stdint.h>#include <stdio.h>#define SP_BUFSIZE 4096#ifndef SPFLOAT#define SPFLOAT float#endif#define SP_OK 1#define SP_NOT_OK 0#define SP_RANDMAX 2147483648typedef unsigned long sp_frame;typedef struct sp_auxdata { size_t size; void *ptr;} sp_auxdata;typedef struct sp_data { SPFLOAT *out; int sr; int nchan; unsigned long len; unsigned long pos; char filename[200]; uint32_t rand;} sp_data;typedef struct { char state; SPFLOAT val;} sp_param;int sp_auxdata_alloc(sp_auxdata *aux, size_t size);int sp_auxdata_free(sp_auxdata *aux);int sp_create(sp_data **spp);int sp_createn(sp_data **spp, int nchan);int sp_destroy(sp_data **spp);int sp_process(sp_data *sp, void *ud, void (*callback)(sp_data *, void *));int sp_process_raw(sp_data *sp, void *ud, void (*callback)(sp_data *, void *));int sp_process_plot(sp_data *sp, void *ud, void (*callback)(sp_data *, void *));int sp_process_spa(sp_data *sp, void *ud, void (*callback)(sp_data *, void *));SPFLOAT sp_midi2cps(SPFLOAT nn);int sp_set(sp_param *p, SPFLOAT val);int sp_out(sp_data *sp, uint32_t chan, SPFLOAT val);uint32_t sp_rand(sp_data *sp);void sp_srand(sp_data *sp, uint32_t val);typedef struct { SPFLOAT *utbl; int16_t *BRLow; int16_t *BRLowCpx;} sp_fft;void sp_fft_create(sp_fft **fft);void sp_fft_init(sp_fft *fft, int M);void sp_fftr(sp_fft *fft, SPFLOAT *buf, int FFTsize);void sp_fft_cpx(sp_fft *fft, SPFLOAT *buf, int FFTsize);void sp_ifftr(sp_fft *fft, SPFLOAT *buf, int FFTsize);void sp_fft_destroy(sp_fft *fft);#ifndef kiss_fft_scalar#define kiss_fft_scalar SPFLOAT#endiftypedef struct { kiss_fft_scalar r; kiss_fft_scalar i;}kiss_fft_cpx;typedef struct kiss_fft_state* kiss_fft_cfg;typedef struct kiss_fftr_state* kiss_fftr_cfg;/* SPA: Soundpipe Audio */enum { SPA_READ, SPA_WRITE, SPA_NULL };typedef struct { char magic; char nchan; uint16_t sr; uint32_t len;} spa_header;typedef struct { spa_header header; size_t offset; int mode; FILE *fp; uint32_t pos;} sp_audio;#define SP_FT_MAXLEN 0x1000000L#define SP_FT_PHMASK 0x0FFFFFFLtypedef struct sp_ftbl{ size_t size; uint32_t lobits; uint32_t lomask; SPFLOAT lodiv; SPFLOAT sicvt; SPFLOAT *tbl; char del;}sp_ftbl;int sp_ftbl_create(sp_data *sp, sp_ftbl **ft, size_t size);int sp_ftbl_init(sp_data *sp, sp_ftbl *ft, size_t size);int sp_ftbl_bind(sp_data *sp, sp_ftbl **ft, SPFLOAT *tbl, size_t size);int sp_ftbl_destroy(sp_ftbl **ft);int sp_gen_vals(sp_data *sp, sp_ftbl *ft, const char *string);int sp_gen_sine(sp_data *sp, sp_ftbl *ft);int sp_gen_file(sp_data *sp, sp_ftbl *ft, const char *filename);int sp_gen_sinesum(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_line(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_xline(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_gauss(sp_data *sp, sp_ftbl *ft, SPFLOAT scale, uint32_t seed);int sp_ftbl_loadfile(sp_data *sp, sp_ftbl **ft, const char *filename);int sp_ftbl_loadspa(sp_data *sp, sp_ftbl **ft, const char *filename);int sp_gen_composite(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_rand(sp_data *sp, sp_ftbl *ft, const char *argstring);int sp_gen_triangle(sp_data *sp, sp_ftbl *ft);typedef struct { int mti; /* do not change value 624 */ uint32_t mt[624];} sp_randmt;void sp_randmt_seed(sp_randmt *p, const uint32_t *initKey, uint32_t keyLength);uint32_t sp_randmt_compute(sp_randmt *p);typedef struct { SPFLOAT atk; SPFLOAT dec; SPFLOAT sus; SPFLOAT rel; uint32_t timer; uint32_t atk_time; SPFLOAT a; SPFLOAT b; SPFLOAT y; SPFLOAT x; SPFLOAT prev; int mode;} sp_adsr;int sp_adsr_create(sp_adsr **p);int sp_adsr_destroy(sp_adsr **p);int sp_adsr_init(sp_data *sp, sp_adsr *p);int sp_adsr_compute(sp_data *sp, sp_adsr *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT hp; SPFLOAT c1, c2, yt1, prvhp; SPFLOAT tpidsr;} sp_atone;int sp_atone_create(sp_atone **p);int sp_atone_destroy(sp_atone **p);int sp_atone_init(sp_data *sp, sp_atone *p);int sp_atone_compute(sp_data *sp, sp_atone *p, SPFLOAT *in, SPFLOAT *out);typedef struct { void *ud; int argpos; SPFLOAT *args[2]; SPFLOAT *freq; SPFLOAT *amp;} sp_blsaw;int sp_blsaw_create(sp_blsaw **p);int sp_blsaw_destroy(sp_blsaw **p);int sp_blsaw_init(sp_data *sp, sp_blsaw *p);int sp_blsaw_compute(sp_data *sp, sp_blsaw *p, SPFLOAT *in, SPFLOAT *out);typedef struct { void *ud; int argpos; SPFLOAT *args[3]; SPFLOAT *freq; SPFLOAT *amp; SPFLOAT *width;} sp_blsquare;int sp_blsquare_create(sp_blsquare **p);int sp_blsquare_destroy(sp_blsquare **p);int sp_blsquare_init(sp_data *sp, sp_blsquare *p);int sp_blsquare_compute(sp_data *sp, sp_blsquare *p, SPFLOAT *in, SPFLOAT *out);typedef struct { void *ud; int argpos; SPFLOAT *args[2]; SPFLOAT *freq; SPFLOAT *amp;} sp_bltriangle;int sp_bltriangle_create(sp_bltriangle **p);int sp_bltriangle_destroy(sp_bltriangle **p);int sp_bltriangle_init(sp_data *sp, sp_bltriangle *p);int sp_bltriangle_compute(sp_data *sp, sp_bltriangle *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT brown;} sp_brown;int sp_brown_create(sp_brown **p);int sp_brown_destroy(sp_brown **p);int sp_brown_init(sp_data *sp, sp_brown *p);int sp_brown_compute(sp_data *sp, sp_brown *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT freq; SPFLOAT lfreq; SPFLOAT a[7]; SPFLOAT pidsr;} sp_buthp;int sp_buthp_create(sp_buthp **p);int sp_buthp_destroy(sp_buthp **p);int sp_buthp_init(sp_data *sp, sp_buthp *p);int sp_buthp_compute(sp_data *sp, sp_buthp *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT sr, freq; SPFLOAT lfreq; SPFLOAT a[7]; SPFLOAT pidsr;} sp_butlp;int sp_butlp_create(sp_butlp **p);int sp_butlp_destroy(sp_butlp **p);int sp_butlp_init(sp_data *sp, sp_butlp *p);int sp_butlp_compute(sp_data *sp, sp_butlp *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT min; SPFLOAT max;} sp_clamp;int sp_clamp_create(sp_clamp **p);int sp_clamp_destroy(sp_clamp **p);int sp_clamp_init(sp_data *sp, sp_clamp *p);int sp_clamp_compute(sp_data *sp, sp_clamp *p, SPFLOAT *in, SPFLOAT *out);typedef struct{ SPFLOAT lim, k1;}sp_clip;int sp_clip_create(sp_clip **p);int sp_clip_destroy(sp_clip **p);int sp_clip_init(sp_data *sp, sp_clip *p);int sp_clip_compute(sp_data *sp, sp_clip *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT bpm; SPFLOAT subdiv; uint32_t counter;} sp_clock;int sp_clock_create(sp_clock **p);int sp_clock_destroy(sp_clock **p);int sp_clock_init(sp_data *sp, sp_clock *p);int sp_clock_compute(sp_data *sp, sp_clock *p, SPFLOAT *trig, SPFLOAT *out);typedef struct { SPFLOAT pos;} sp_crossfade;int sp_crossfade_create(sp_crossfade **p);int sp_crossfade_destroy(sp_crossfade **p);int sp_crossfade_init(sp_data *sp, sp_crossfade *p);int sp_crossfade_compute(sp_data *sp, sp_crossfade *p, SPFLOAT *in1, SPFLOAT *in2, SPFLOAT *out);typedef struct { SPFLOAT gg; SPFLOAT outputs; SPFLOAT inputs; SPFLOAT gain;} sp_dcblock;int sp_dcblock_create(sp_dcblock **p);int sp_dcblock_destroy(sp_dcblock **p);int sp_dcblock_init(sp_data *sp, sp_dcblock *p);int sp_dcblock_compute(sp_data *sp, sp_dcblock *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT time; SPFLOAT feedback; SPFLOAT last; sp_auxdata buf; uint32_t bufsize; uint32_t bufpos;} sp_delay;int sp_delay_create(sp_delay **p);int sp_delay_destroy(sp_delay **p);int sp_delay_init(sp_data *sp, sp_delay *p, SPFLOAT time);int sp_delay_compute(sp_data *sp, sp_delay *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT a, dur, b; SPFLOAT val, incr; uint32_t sdur, stime; int init;} sp_expon;int sp_expon_create(sp_expon **p);int sp_expon_destroy(sp_expon **p);int sp_expon_init(sp_data *sp, sp_expon *p);int sp_expon_compute(sp_data *sp, sp_expon *p, SPFLOAT *in, SPFLOAT *out);typedef struct sp_fosc{ SPFLOAT amp, freq, car, mod, indx, iphs; int32_t mphs, cphs; sp_ftbl *ft;} sp_fosc;int sp_fosc_create(sp_fosc **p);int sp_fosc_destroy(sp_fosc **p);int sp_fosc_init(sp_data *sp, sp_fosc *p, sp_ftbl *ft);int sp_fosc_compute(sp_data *sp, sp_fosc *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT a, dur, b; SPFLOAT val, incr; uint32_t sdur, stime; int init;} sp_line;int sp_line_create(sp_line **p);int sp_line_destroy(sp_line **p);int sp_line_init(sp_data *sp, sp_line *p);int sp_line_compute(sp_data *sp, sp_line *p, SPFLOAT *in, SPFLOAT *out);typedef struct sp_lpf18{ SPFLOAT cutoff, res, dist; SPFLOAT ay1, ay2, aout, lastin, onedsr;} sp_lpf18;int sp_lpf18_create(sp_lpf18 **p);int sp_lpf18_destroy(sp_lpf18 **p);int sp_lpf18_init(sp_data *sp, sp_lpf18 *p);int sp_lpf18_compute(sp_data *sp, sp_lpf18 *p, SPFLOAT *in, SPFLOAT *out);typedef struct sp_metro{ SPFLOAT freq; SPFLOAT phs; int init; SPFLOAT onedsr;} sp_metro;int sp_metro_create(sp_metro **p);int sp_metro_destroy(sp_metro **p);int sp_metro_init(sp_data *sp, sp_metro *p);int sp_metro_compute(sp_data *sp, sp_metro *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT freq; SPFLOAT res; SPFLOAT istor; SPFLOAT delay[6]; SPFLOAT tanhstg[3]; SPFLOAT oldfreq; SPFLOAT oldres; SPFLOAT oldacr; SPFLOAT oldtune;} sp_moogladder;int sp_moogladder_create(sp_moogladder **t);int sp_moogladder_destroy(sp_moogladder **t);int sp_moogladder_init(sp_data *sp, sp_moogladder *p);int sp_moogladder_compute(sp_data *sp, sp_moogladder *p, SPFLOAT *in, SPFLOAT *out);typedef struct{ SPFLOAT amp;}sp_noise;int sp_noise_create(sp_noise **ns);int sp_noise_init(sp_data *sp, sp_noise *ns);int sp_noise_compute(sp_data *sp, sp_noise *ns, SPFLOAT *in, SPFLOAT *out);int sp_noise_destroy(sp_noise **ns);typedef struct { SPFLOAT freq, amp, iphs; int32_t lphs; sp_ftbl *tbl; int inc;} sp_osc;int sp_osc_create(sp_osc **osc);int sp_osc_destroy(sp_osc **osc);int sp_osc_init(sp_data *sp, sp_osc *osc, sp_ftbl *ft, SPFLOAT iphs);int sp_osc_compute(sp_data *sp, sp_osc *osc, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT pan; uint32_t type;} sp_pan2;int sp_pan2_create(sp_pan2 **p);int sp_pan2_destroy(sp_pan2 **p);int sp_pan2_init(sp_data *sp, sp_pan2 *p);int sp_pan2_compute(sp_data *sp, sp_pan2 *p, SPFLOAT *in, SPFLOAT *out1, SPFLOAT *out2);typedef struct { SPFLOAT atk, rel, thresh; SPFLOAT patk, prel; SPFLOAT b0_r, a1_r, b0_a, a1_a, level;} sp_peaklim;int sp_peaklim_create(sp_peaklim **p);int sp_peaklim_destroy(sp_peaklim **p);int sp_peaklim_init(sp_data *sp, sp_peaklim *p);int sp_peaklim_compute(sp_data *sp, sp_peaklim *p, SPFLOAT *in, SPFLOAT *out);typedef struct sp_phasor{ SPFLOAT freq, phs; SPFLOAT onedsr;} sp_phasor;int sp_phasor_create(sp_phasor **p);int sp_phasor_destroy(sp_phasor **p);int sp_phasor_init(sp_data *sp, sp_phasor *p, SPFLOAT iphs);int sp_phasor_compute(sp_data *sp, sp_phasor *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT amp; unsigned int newrand; unsigned int prevrand; unsigned int k; unsigned int seed; unsigned int total; uint32_t counter; unsigned int dice[7];} sp_pinknoise;int sp_pinknoise_create(sp_pinknoise **p);int sp_pinknoise_destroy(sp_pinknoise **p);int sp_pinknoise_init(sp_data *sp, sp_pinknoise *p);int sp_pinknoise_compute(sp_data *sp, sp_pinknoise *p, SPFLOAT *in, SPFLOAT *out);typedef struct{ SPFLOAT smooth; SPFLOAT a1, b0, y0, psmooth; SPFLOAT onedsr;}sp_port;int sp_port_create(sp_port **p);int sp_port_destroy(sp_port **p);int sp_port_init(sp_data *sp, sp_port *p);int sp_port_compute(sp_data *sp, sp_port *p, SPFLOAT *in, SPFLOAT *out);int sp_port_reset(sp_data *sp, sp_port *p, SPFLOAT *in);typedef struct { SPFLOAT freq, amp, iphs; sp_ftbl *tbl; int32_t tablen; SPFLOAT tablenUPsr; SPFLOAT phs; SPFLOAT onedsr;} sp_posc3;int sp_posc3_create(sp_posc3 **posc3);int sp_posc3_destroy(sp_posc3 **posc3);int sp_posc3_init(sp_data *sp, sp_posc3 *posc3, sp_ftbl *ft);int sp_posc3_compute(sp_data *sp, sp_posc3 *posc3, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT freq; SPFLOAT min, max; SPFLOAT val; uint32_t counter, dur;} sp_randh;int sp_randh_create(sp_randh **p);int sp_randh_destroy(sp_randh **p);int sp_randh_init(sp_data *sp, sp_randh *p);int sp_randh_compute(sp_data *sp, sp_randh *p, SPFLOAT *in, SPFLOAT *out);typedef struct { SPFLOAT min, max, cps, mode, fstval; int16_t cpscod; int32_t phs; SPFLOAT num1, num2, dfdmax; int holdrand; SPFLOAT sicvt;} sp_randi;int sp_randi_create(sp_randi **p);int sp_randi_destroy(sp_randi **p);int sp_randi_init(sp_data *sp, sp_randi *p);int sp_randi_compute(sp_data *sp, sp_randi *p, SPFLOAT *in, SPFLOAT *out);typedef struct { int writePos; int bufferSize; int readPos; int readPosFrac; int readPosFrac_inc; int dummy; int seedVal; int randLine_cnt; SPFLOAT filterState; SPFLOAT *buf;} sp_revsc_dl;typedef struct { SPFLOAT feedback, lpfreq; SPFLOAT iSampleRate, iPitchMod, iSkipInit; SPFLOAT sampleRate; SPFLOAT dampFact; SPFLOAT prv_LPFreq; int initDone; sp_revsc_dl delayLines[8]; sp_auxdata aux;} sp_revsc;int sp_revsc_create(sp_revsc **p);int sp_revsc_destroy(sp_revsc **p);int sp_revsc_init(sp_data *sp, sp_revsc *p);Showing the first 500 of 618 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/soundpipe/h/tadsr.hadded
typedef struct { SPFLOAT value; SPFLOAT target; SPFLOAT rate; int state; SPFLOAT attackRate; SPFLOAT decayRate; SPFLOAT sustainLevel; SPFLOAT releaseRate; SPFLOAT atk; SPFLOAT rel; SPFLOAT sus; SPFLOAT dec; int mode;} sp_tadsr;int sp_tadsr_create(sp_tadsr **p);int sp_tadsr_destroy(sp_tadsr **p);int sp_tadsr_init(sp_data *sp, sp_tadsr *p);int sp_tadsr_compute(sp_data *sp, sp_tadsr *p, SPFLOAT *trig, SPFLOAT *out);vendor/soundpipe/h/tenv.hadded
typedef struct sp_tenv{ uint32_t pos, atk_end, rel_start, sr, totaldur; SPFLOAT atk, rel, hold; SPFLOAT atk_slp, rel_slp; SPFLOAT last; int sigmode; SPFLOAT input; int started;} sp_tenv;int sp_tenv_create(sp_tenv **p);int sp_tenv_destroy(sp_tenv **p);int sp_tenv_init(sp_data *sp, sp_tenv *p);int sp_tenv_compute(sp_data *sp, sp_tenv *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/tgate.hadded
typedef struct { SPFLOAT time; uint32_t timer;} sp_tgate;int sp_tgate_create(sp_tgate **p);int sp_tgate_destroy(sp_tgate **p);int sp_tgate_init(sp_data *sp, sp_tgate *p);int sp_tgate_compute(sp_data *sp, sp_tgate *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/tone.hadded
typedef struct { SPFLOAT hp; SPFLOAT c1, c2, yt1, prvhp; SPFLOAT tpidsr;} sp_tone;int sp_tone_create(sp_tone **t);int sp_tone_destroy(sp_tone **t);int sp_tone_init(sp_data *sp, sp_tone *t);int sp_tone_compute(sp_data *sp, sp_tone *t, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/vdelay.hadded
typedef struct sp_vdelay{ SPFLOAT del, maxdel; SPFLOAT feedback; SPFLOAT prev; SPFLOAT sr; sp_auxdata buf; int32_t left;} sp_vdelay;int sp_vdelay_create(sp_vdelay **p);int sp_vdelay_destroy(sp_vdelay **p);int sp_vdelay_init(sp_data *sp, sp_vdelay *p, SPFLOAT maxdel);int sp_vdelay_compute(sp_data *sp, sp_vdelay *p, SPFLOAT *in, SPFLOAT *out);int sp_vdelay_reset(sp_data *sp, sp_vdelay *p);vendor/soundpipe/h/wavout.hadded
typedef struct sp_wavout sp_wavout;int sp_wavout_create(sp_wavout **p);int sp_wavout_destroy(sp_wavout **p);int sp_wavout_init(sp_data *sp, sp_wavout *p, const char *filename);int sp_wavout_compute(sp_data *sp, sp_wavout *p, SPFLOAT *in, SPFLOAT *out);vendor/soundpipe/h/zitarev.hadded
typedef struct { void *faust; int argpos; SPFLOAT *args[11]; SPFLOAT *in_delay; SPFLOAT *lf_x; SPFLOAT *rt60_low; SPFLOAT *rt60_mid; SPFLOAT *hf_damping; SPFLOAT *eq1_freq; SPFLOAT *eq1_level; SPFLOAT *eq2_freq; SPFLOAT *eq2_level; SPFLOAT *mix; SPFLOAT *level;} sp_zitarev;int sp_zitarev_create(sp_zitarev **p);int sp_zitarev_destroy(sp_zitarev **p);int sp_zitarev_init(sp_data *sp, sp_zitarev *p);int sp_zitarev_compute(sp_data *sp, sp_zitarev *p, SPFLOAT *in1, SPFLOAT *in2, SPFLOAT *out1, SPFLOAT *out2);vendor/soundpipe/lib/dr_wav/Makefileadded
CFLAGS += -Ilib/dr_wav/LPATHS += $(LIBDIR)/dr_wav/dr_wav.o$(LIBDIR)/dr_wav/dr_wav.o: lib/dr_wav/dr_wav.c | $(LIBDIR)/dr_wav $(CC) $(CFLAGS) $< -c -o $@vendor/soundpipe/lib/dr_wav/dr_wav.cadded
#define DR_WAV_IMPLEMENTATION#include "dr_wav.h"vendor/soundpipe/lib/dr_wav/dr_wav.hadded
// WAV audio loader and writer. Public domain. See "unlicense" statement at the end of this file.// dr_wav - v0.7 - 2017-11-04//// David Reid - [email protected]// USAGE//// This is a single-file library. To use it, do something like the following in one .c file.// #define DR_WAV_IMPLEMENTATION// #include "dr_wav.h"//// You can then #include this file in other parts of the program as you would with any other header file. Do something// like the following to read audio data://// drwav wav;// if (!drwav_init_file(&wav, "my_song.wav")) {// // Error opening WAV file.// }//// drwav_int32* pDecodedInterleavedSamples = malloc(wav.totalSampleCount * sizeof(drwav_int32));// size_t numberOfSamplesActuallyDecoded = drwav_read_s32(&wav, wav.totalSampleCount, pDecodedInterleavedSamples);//// ...//// drwav_uninit(&wav);//// You can also use drwav_open() to allocate and initialize the loader for you://// drwav* pWav = drwav_open_file("my_song.wav");// if (pWav == NULL) {// // Error opening WAV file.// }//// ...//// drwav_close(pWav);//// If you just want to quickly open and read the audio data in a single operation you can do something like this://// unsigned int channels;// unsigned int sampleRate;// drwav_uint64 totalSampleCount;// float* pSampleData = drwav_open_and_read_file_s32("my_song.wav", &channels, &sampleRate, &totalSampleCount);// if (pSampleData == NULL) {// // Error opening and reading WAV file.// }//// ...//// drwav_free(pSampleData);//// The examples above use versions of the API that convert the audio data to a consistent format (32-bit signed PCM, in// this case), but you can still output the audio data in it's internal format (see notes below for supported formats)://// size_t samplesRead = drwav_read(&wav, wav.totalSampleCount, pDecodedInterleavedSamples);//// You can also read the raw bytes of audio data, which could be useful if dr_wav does not have native support for// a particular data format://// size_t bytesRead = drwav_read_raw(&wav, bytesToRead, pRawDataBuffer);////// dr_wav has seamless support the Sony Wave64 format. The decoder will automatically detect it and it should Just Work// without any manual intervention.////// dr_wav can also be used to output WAV files. This does not currently support compressed formats. To use this, look at// drwav_open_write(), drwav_open_file_write(), etc. Use drwav_write() to write samples, or drwav_write_raw() to write// raw data in the "data" chunk.//// drwav_data_format format;// format.container = drwav_container_riff; // <-- drwav_container_riff = normal WAV files, drwav_container_w64 = Sony Wave64.// format.format = DR_WAVE_FORMAT_PCM; // <-- Any of the DR_WAVE_FORMAT_* codes.// format.channels = 2;// format.sampleRate = 44100;// format.bitsPerSample = 16;// drwav* pWav = drwav_open_file_write("data/recording.wav", &format);//// ...//// drwav_uint64 samplesWritten = drwav_write(pWav, sampleCount, pSamples);//////// OPTIONS// #define these options before including this file.//// #define DR_WAV_NO_CONVERSION_API// Disables conversion APIs such as drwav_read_f32() and drwav_s16_to_f32().//// #define DR_WAV_NO_STDIO// Disables drwav_open_file(), drwav_open_file_write(), etc.//////// QUICK NOTES// - Samples are always interleaved.// - The default read function does not do any data conversion. Use drwav_read_f32() to read and convert audio data// to IEEE 32-bit floating point samples, drwav_read_s32() to read samples as signed 32-bit PCM and drwav_read_s16()// to read samples as signed 16-bit PCM. Tested and supported internal formats include the following:// - Unsigned 8-bit PCM// - Signed 12-bit PCM// - Signed 16-bit PCM// - Signed 24-bit PCM// - Signed 32-bit PCM// - IEEE 32-bit floating point.// - IEEE 64-bit floating point.// - A-law and u-law// - Microsoft ADPCM// - IMA ADPCM (DVI, format code 0x11)// - dr_wav will try to read the WAV file as best it can, even if it's not strictly conformant to the WAV format.#ifndef dr_wav_h#define dr_wav_h#include <stddef.h>#if defined(_MSC_VER) && _MSC_VER < 1600typedef signed char drwav_int8;typedef unsigned char drwav_uint8;typedef signed short drwav_int16;typedef unsigned short drwav_uint16;typedef signed int drwav_int32;typedef unsigned int drwav_uint32;typedef signed __int64 drwav_int64;typedef unsigned __int64 drwav_uint64;#else#include <stdint.h>typedef int8_t drwav_int8;typedef uint8_t drwav_uint8;typedef int16_t drwav_int16;typedef uint16_t drwav_uint16;typedef int32_t drwav_int32;typedef uint32_t drwav_uint32;typedef int64_t drwav_int64;typedef uint64_t drwav_uint64;#endiftypedef drwav_uint8 drwav_bool8;typedef drwav_uint32 drwav_bool32;#define DRWAV_TRUE 1#define DRWAV_FALSE 0#ifdef __cplusplusextern "C" {#endif// Common data formats.#define DR_WAVE_FORMAT_PCM 0x1#define DR_WAVE_FORMAT_ADPCM 0x2#define DR_WAVE_FORMAT_IEEE_FLOAT 0x3#define DR_WAVE_FORMAT_ALAW 0x6#define DR_WAVE_FORMAT_MULAW 0x7#define DR_WAVE_FORMAT_DVI_ADPCM 0x11#define DR_WAVE_FORMAT_EXTENSIBLE 0xFFFEtypedef enum{ drwav_seek_origin_start, drwav_seek_origin_current} drwav_seek_origin;typedef enum{ drwav_container_riff, drwav_container_w64} drwav_container;// Callback for when data is read. Return value is the number of bytes actually read.//// pUserData [in] The user data that was passed to drwav_init(), drwav_open() and family.// pBufferOut [out] The output buffer.// bytesToRead [in] The number of bytes to read.//// Returns the number of bytes actually read.//// A return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until// either the entire bytesToRead is filled or you have reached the end of the stream.typedef size_t (* drwav_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);// Callback for when data is written. Returns value is the number of bytes actually written.//// pUserData [in] The user data that was passed to drwav_init_write(), drwav_open_write() and family.// pData [out] A pointer to the data to write.// bytesToWrite [in] The number of bytes to write.//// Returns the number of bytes actually written.//// If the return value differs from bytesToWrite, it indicates an error.typedef size_t (* drwav_write_proc)(void* pUserData, const void* pData, size_t bytesToWrite);// Callback for when data needs to be seeked.//// pUserData [in] The user data that was passed to drwav_init(), drwav_open() and family.// offset [in] The number of bytes to move, relative to the origin. Will never be negative.// origin [in] The origin of the seek - the current position or the start of the stream.//// Returns whether or not the seek was successful.//// Whether or not it is relative to the beginning or current position is determined by the "origin" parameter which// will be either drwav_seek_origin_start or drwav_seek_origin_current.typedef drwav_bool32 (* drwav_seek_proc)(void* pUserData, int offset, drwav_seek_origin origin);// Structure for internal use. Only used for loaders opened with drwav_open_memory().typedef struct{ const drwav_uint8* data; size_t dataSize; size_t currentReadPos;} drwav__memory_stream;// Structure for internal use. Only used for writers opened with drwav_open_memory_write().typedef struct{ void** ppData; size_t* pDataSize; size_t dataSize; size_t dataCapacity; size_t currentWritePos;} drwav__memory_stream_write;typedef struct{ drwav_container container; // RIFF, W64. drwav_uint32 format; // DR_WAVE_FORMAT_* drwav_uint32 channels; drwav_uint32 sampleRate; drwav_uint32 bitsPerSample;} drwav_data_format;typedef struct{ // The format tag exactly as specified in the wave file's "fmt" chunk. This can be used by applications // that require support for data formats not natively supported by dr_wav. drwav_uint16 formatTag; // The number of channels making up the audio data. When this is set to 1 it is mono, 2 is stereo, etc. drwav_uint16 channels; // The sample rate. Usually set to something like 44100. drwav_uint32 sampleRate; // Average bytes per second. You probably don't need this, but it's left here for informational purposes. drwav_uint32 avgBytesPerSec; // Block align. This is equal to the number of channels * bytes per sample. drwav_uint16 blockAlign; // Bit's per sample. drwav_uint16 bitsPerSample; // The size of the extended data. Only used internally for validation, but left here for informational purposes. drwav_uint16 extendedSize; // The number of valid bits per sample. When <formatTag> is equal to WAVE_FORMAT_EXTENSIBLE, <bitsPerSample> // is always rounded up to the nearest multiple of 8. This variable contains information about exactly how // many bits a valid per sample. Mainly used for informational purposes. drwav_uint16 validBitsPerSample; // The channel mask. Not used at the moment. drwav_uint32 channelMask; // The sub-format, exactly as specified by the wave file. drwav_uint8 subFormat[16];} drwav_fmt;typedef struct{ // A pointer to the function to call when more data is needed. drwav_read_proc onRead; // A pointer to the function to call when data needs to be written. Only used when the drwav object is opened in write mode. drwav_write_proc onWrite; // A pointer to the function to call when the wav file needs to be seeked. drwav_seek_proc onSeek; // The user data to pass to callbacks. void* pUserData; // Whether or not the WAV file is formatted as a standard RIFF file or W64. drwav_container container; // Structure containing format information exactly as specified by the wav file. drwav_fmt fmt; // The sample rate. Will be set to something like 44100. drwav_uint32 sampleRate; // The number of channels. This will be set to 1 for monaural streams, 2 for stereo, etc. drwav_uint16 channels; // The bits per sample. Will be set to somthing like 16, 24, etc. drwav_uint16 bitsPerSample; // The number of bytes per sample. drwav_uint16 bytesPerSample; // Equal to fmt.formatTag, or the value specified by fmt.subFormat if fmt.formatTag is equal to 65534 (WAVE_FORMAT_EXTENSIBLE). drwav_uint16 translatedFormatTag; // The total number of samples making up the audio data. Use <totalSampleCount> * <bytesPerSample> to calculate // the required size of a buffer to hold the entire audio data. drwav_uint64 totalSampleCount; // The size in bytes of the data chunk. drwav_uint64 dataChunkDataSize; // The position in the stream of the first byte of the data chunk. This is used for seeking. drwav_uint64 dataChunkDataPos; // The number of bytes remaining in the data chunk. drwav_uint64 bytesRemaining; // A hack to avoid a DRWAV_MALLOC() when opening a decoder with drwav_open_memory(). drwav__memory_stream memoryStream; drwav__memory_stream_write memoryStreamWrite; // Generic data for compressed formats. This data is shared across all block-compressed formats. struct { drwav_uint64 iCurrentSample; // The index of the next sample that will be read by drwav_read_*(). This is used with "totalSampleCount" to ensure we don't read excess samples at the end of the last block. } compressed; // Microsoft ADPCM specific data. struct { drwav_uint32 bytesRemainingInBlock; drwav_uint16 predictor[2]; drwav_int32 delta[2]; drwav_int32 cachedSamples[4]; // Samples are stored in this cache during decoding. drwav_uint32 cachedSampleCount; drwav_int32 prevSamples[2][2]; // The previous 2 samples for each channel (2 channels at most). } msadpcm; // IMA ADPCM specific data. struct { drwav_uint32 bytesRemainingInBlock; drwav_int32 predictor[2]; drwav_int32 stepIndex[2]; drwav_int32 cachedSamples[16]; // Samples are stored in this cache during decoding. drwav_uint32 cachedSampleCount; } ima;} drwav;// Initializes a pre-allocated drwav object.//// onRead [in] The function to call when data needs to be read from the client.// onSeek [in] The function to call when the read position of the client data needs to move.// pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek.//// Returns true if successful; false otherwise.//// Close the loader with drwav_uninit().//// This is the lowest level function for initializing a WAV file. You can also use drwav_init_file() and drwav_init_memory()// to open the stream from a file or from a block of memory respectively.//// If you want dr_wav to manage the memory allocation for you, consider using drwav_open() instead. This will allocate// a drwav object on the heap and return a pointer to it.//// See also: drwav_init_file(), drwav_init_memory(), drwav_uninit()drwav_bool32 drwav_init(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData);// Initializes a pre-allocated drwav object for writing.//// onWrite [in] The function to call when data needs to be written.// onSeek [in] The function to call when the write position needs to move.// pUserData [in, optional] A pointer to application defined data that will be passed to onWrite and onSeek.//// Returns true if successful; false otherwise.//// Close the writer with drwav_uninit().//// This is the lowest level function for initializing a WAV file. You can also use drwav_init_file() and drwav_init_memory()// to open the stream from a file or from a block of memory respectively.//// If you want dr_wav to manage the memory allocation for you, consider using drwav_open() instead. This will allocate// a drwav object on the heap and return a pointer to it.//// See also: drwav_init_file_write(), drwav_init_memory_write(), drwav_uninit()drwav_bool32 drwav_init_write(drwav* pWav, const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData);// Uninitializes the given drwav object.//// Use this only for objects initialized with drwav_init().void drwav_uninit(drwav* pWav);// Opens a wav file using the given callbacks.//// onRead [in] The function to call when data needs to be read from the client.// onSeek [in] The function to call when the read position of the client data needs to move.// pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek.//// Returns null on error.//// Close the loader with drwav_close().//// This is the lowest level function for opening a WAV file. You can also use drwav_open_file() and drwav_open_memory()// to open the stream from a file or from a block of memory respectively.//// This is different from drwav_init() in that it will allocate the drwav object for you via DRWAV_MALLOC() before// initializing it.//// See also: drwav_open_file(), drwav_open_memory(), drwav_close()drwav* drwav_open(drwav_read_proc onRead, drwav_seek_proc onSeek, void* pUserData);// Opens a wav file for writing using the given callbacks.//// onWrite [in] The function to call when data needs to be written.// onSeek [in] The function to call when the write position needs to move.// pUserData [in, optional] A pointer to application defined data that will be passed to onWrite and onSeek.//// Returns null on error.//// Close the loader with drwav_close().//// This is the lowest level function for opening a WAV file. You can also use drwav_open_file_write() and drwav_open_memory_write()// to open the stream from a file or from a block of memory respectively.//// This is different from drwav_init_write() in that it will allocate the drwav object for you via DRWAV_MALLOC() before// initializing it.//// See also: drwav_open_file_write(), drwav_open_memory_write(), drwav_close()drwav* drwav_open_write(const drwav_data_format* pFormat, drwav_write_proc onWrite, drwav_seek_proc onSeek, void* pUserData);// Uninitializes and deletes the the given drwav object.//// Use this only for objects created with drwav_open().void drwav_close(drwav* pWav);// Reads raw audio data.//// This is the lowest level function for reading audio data. It simply reads the given number of// bytes of the raw internal sample data.//// Consider using drwav_read_s16(), drwav_read_s32() or drwav_read_f32() for reading sample data in// a consistent format.//// Returns the number of bytes actually read.size_t drwav_read_raw(drwav* pWav, size_t bytesToRead, void* pBufferOut);// Reads a chunk of audio data in the native internal format.//// This is typically the most efficient way to retrieve audio data, but it does not do any format// conversions which means you'll need to convert the data manually if required.//// If the return value is less than <samplesToRead> it means the end of the file has been reached or// you have requested more samples than can possibly fit in the output buffer.//// This function will only work when sample data is of a fixed size and uncompressed. If you are// using a compressed format consider using drwav_read_raw() or drwav_read_s16/s32/f32/etc().drwav_uint64 drwav_read(drwav* pWav, drwav_uint64 samplesToRead, void* pBufferOut);// Seeks to the given sample.//// Returns true if successful; false otherwise.drwav_bool32 drwav_seek_to_sample(drwav* pWav, drwav_uint64 sample);// Writes raw audio data.//// Returns the number of bytes actually written. If this differs from bytesToWrite, it indicates an error.size_t drwav_write_raw(drwav* pWav, size_t bytesToWrite, const void* pData);// Writes audio data based on sample counts.//// Returns the number of samples written.drwav_uint64 drwav_write(drwav* pWav, drwav_uint64 samplesToWrite, const void* pData);//// Convertion Utilities ////#ifndef DR_WAV_NO_CONVERSION_API// Reads a chunk of audio data and converts it to signed 16-bit PCM samples.//// Returns the number of samples actually read.//// If the return value is less than <samplesToRead> it means the end of the file has been reached.drwav_uint64 drwav_read_s16(drwav* pWav, drwav_uint64 samplesToRead, drwav_int16* pBufferOut);// Low-level function for converting unsigned 8-bit PCM samples to signed 16-bit PCM samples.void drwav_u8_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount);// Low-level function for converting signed 24-bit PCM samples to signed 16-bit PCM samples.void drwav_s24_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCount);// Low-level function for converting signed 32-bit PCM samples to signed 16-bit PCM samples.void drwav_s32_to_s16(drwav_int16* pOut, const drwav_int32* pIn, size_t sampleCount);Showing the first 500 of 3491 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/soundpipe/lib/faust/CUI.hadded
#include <stdlib.h>#ifndef FAUSTFLOAT#define FAUSTFLOAT SPFLOAT#endiftypedef void (* addHorizontalSliderFun) (void* ui_interface, const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step);typedef void (* addVerticalSliderFun) (void* ui_interface, const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step);typedef void (* addCheckButtonFun) (void* ui_interface, const char* label, FAUSTFLOAT* zone);typedef struct { void* uiInterface; addHorizontalSliderFun addHorizontalSlider; addVerticalSliderFun addVerticalSlider; addCheckButtonFun addCheckButton;} UIGlue;vendor/soundpipe/modules/adsr.cadded
#include <stdlib.h>#include <math.h>#include "soundpipe.h"enum { CLEAR, ATTACK, DECAY, SUSTAIN, RELEASE };int sp_adsr_create(sp_adsr **p){ *p = malloc(sizeof(sp_adsr)); return SP_OK;}int sp_adsr_destroy(sp_adsr **p){ free(*p); return SP_OK;}int sp_adsr_init(sp_data *sp, sp_adsr *p){ p->atk = 0.1; p->dec = 0.1; p->sus = 0.5; p->rel = 0.3; p->timer = 0; p->a = 0; p->b = 0; p->y = 0; p->x = 0; p->prev = 0; p->atk_time = p->atk * sp->sr; p->mode = CLEAR; return SP_OK;}static SPFLOAT tau2pole(sp_data *sp, sp_adsr *p, SPFLOAT tau){ return exp(-1.0 / (tau * sp->sr));}static SPFLOAT adsr_filter(sp_data *sp, sp_adsr *p){ p->y = p->b * p->x + p->a * p->y; return p->y;}int sp_adsr_compute(sp_data *sp, sp_adsr *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT pole; if (p->prev < *in && p->mode != DECAY) { p->mode = ATTACK; p->timer = 0; /* quick fix: uncomment if broken */ /* pole = tau2pole(sp, p, p->atk * 0.75); */ /* p->atk_time = p->atk * sp->sr * 1.5; */ pole = tau2pole(sp, p, p->atk * 0.6); p->atk_time = p->atk * sp->sr; p->a = pole; p->b = 1 - pole; } else if (p->prev > *in) { p->mode = RELEASE; pole = tau2pole(sp, p, p->rel); p->a = pole; p->b = 1 - pole; } p->x = *in; p->prev = *in; switch (p->mode) { case CLEAR: *out = 0; break; case ATTACK: p->timer++; *out = adsr_filter(sp, p); /* quick fix: uncomment if broken */ /* if(p->timer > p->atk_time) { */ if (*out > 0.99) { p->mode = DECAY; pole = tau2pole(sp, p, p->dec); p->a = pole; p->b = 1 - pole; } break; case DECAY: case RELEASE: p->x *= p->sus; *out = adsr_filter(sp, p); default: break; } return SP_OK;}vendor/soundpipe/modules/atone.cadded
/* * ATone * * This code has been extracted from the Csound opcode "atone". * It has been modified to work as a Soundpipe module. * * Original Author(s): Barry Vercoe, John FFitch, Gabriel Maldonado * Year: 1991 * Location: OOps/ugens5.c * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"#ifndef M_PI#define M_PI 3.14159265358979323846#endifint sp_atone_create(sp_atone **p){ *p = malloc(sizeof(sp_atone)); return SP_OK;}int sp_atone_destroy(sp_atone **p){ free(*p); return SP_OK;}int sp_atone_init(sp_data *sp, sp_atone *p){ p->hp = 1000; SPFLOAT b; p->tpidsr = (2.0 * M_PI) / sp->sr * 1.0; p->prvhp = (SPFLOAT)p->hp; b = 2.0 - cos((SPFLOAT)(p->prvhp * p->tpidsr)); p->c2 = b - sqrt(b * b - 1.0); p->c1 = 1.0 - p->c2; p->yt1 = 0.0; return SP_OK;}int sp_atone_compute(sp_data *sp, sp_atone *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT c2 = p->c2, yt1 = p->yt1; SPFLOAT x; if (p->hp != p->prvhp) { SPFLOAT b; p->prvhp = p->hp; b = 2.0 - cos((SPFLOAT)(p->hp * p->tpidsr)); p->c2 = c2 = b - sqrt(b * b - 1.0); } x = yt1 = c2 * (yt1 + *in); *out = x; yt1 -= *in; p->yt1 = yt1; return SP_OK;}vendor/soundpipe/modules/base.cadded
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <math.h>#ifndef NO_LIBSNDFILE#include <sndfile.h>#endif#include "soundpipe.h"int sp_create(sp_data **spp){ *spp = (sp_data *) malloc(sizeof(sp_data)); sp_data *sp = *spp; sprintf(sp->filename, "test.wav"); sp->nchan = 1; SPFLOAT *out = malloc(sizeof(SPFLOAT) * sp->nchan); *out = 0; sp->out = out; sp->sr = 44100; sp->len = 5 * sp->sr; sp->pos = 0; sp->rand = 0; return 0;}int sp_createn(sp_data **spp, int nchan){ *spp = (sp_data *) malloc(sizeof(sp_data)); sp_data *sp = *spp; sprintf(sp->filename, "test.wav"); sp->nchan = nchan; SPFLOAT *out = malloc(sizeof(SPFLOAT) * sp->nchan); *out = 0; sp->out = out; sp->sr = 44100; sp->len = 5 * sp->sr; sp->pos = 0; sp->rand = 0; return 0;}int sp_destroy(sp_data **spp){ sp_data *sp = *spp; free(sp->out); free(*spp); return 0;}#ifndef NO_LIBSNDFILEint sp_process(sp_data *sp, void *ud, void (*callback)(sp_data *, void *)){ SNDFILE *sf[sp->nchan]; char tmp[140]; SF_INFO info; memset(&info, 0, sizeof(SF_INFO)); SPFLOAT buf[sp->nchan][SP_BUFSIZE]; info.samplerate = sp->sr; info.channels = 1; info.format = SF_FORMAT_WAV | SF_FORMAT_PCM_24; int numsamps, i, chan; if (sp->nchan == 1) { sf[0] = sf_open(sp->filename, SFM_WRITE, &info); } else { for (chan = 0; chan < sp->nchan; chan++) { sprintf(tmp, "%02d_%s", chan, sp->filename); sf[chan] = sf_open(tmp, SFM_WRITE, &info); } } while (sp->len > 0) { if (sp->len < SP_BUFSIZE) { numsamps = sp->len; } else { numsamps = SP_BUFSIZE; } for (i = 0; i < numsamps; i++) { callback(sp, ud); for (chan = 0; chan < sp->nchan; chan++) { buf[chan][i] = sp->out[chan]; } sp->pos++; } for (chan = 0; chan < sp->nchan; chan++) {#ifdef USE_DOUBLE sf_write_double(sf[chan], buf[chan], numsamps);#else sf_write_float(sf[chan], buf[chan], numsamps);#endif } sp->len -= numsamps; } for (i = 0; i < sp->nchan; i++) { sf_close(sf[i]); } return 0;}#endifint sp_process_raw(sp_data *sp, void *ud, void (*callback)(sp_data *, void *)){ int chan; if (sp->len == 0) { while(1) { callback(sp, ud); for (chan = 0; chan < sp->nchan; chan++) { fwrite(&sp->out[chan], sizeof(SPFLOAT), 1, stdout); } sp->len--; } } else { while (sp->len > 0) { callback(sp, ud); for (chan = 0; chan < sp->nchan; chan++) { fwrite(&sp->out[chan], sizeof(SPFLOAT), 1, stdout); } sp->len--; sp->pos++; } } return SP_OK;}int sp_process_plot(sp_data *sp, void *ud, void (*callback)(sp_data *, void *)){ int chan; fprintf(stdout, "sp_out = [ ... \n"); while (sp->len > 0) { callback(sp, ud); for (chan = 0; chan < sp->nchan; chan++) { /* fwrite(&sp->out[chan], sizeof(SPFLOAT), 1, stdout); */ fprintf(stdout, "%g ", sp->out[chan]); } fprintf(stdout, "; ...\n"); sp->len--; sp->pos++; } fprintf(stdout, "];\n"); fprintf(stdout, "plot(sp_out);\n"); fprintf(stdout, "title('Plot generated by Soundpipe');\n"); fprintf(stdout, "xlabel('Time (samples)');\n"); fprintf(stdout, "ylabel('Amplitude');\n"); return SP_OK;}int sp_auxdata_alloc(sp_auxdata *aux, size_t size){ aux->ptr = malloc(size); aux->size = size; memset(aux->ptr, 0, size); return SP_OK;}int sp_auxdata_free(sp_auxdata *aux){ free(aux->ptr); return SP_OK;}SPFLOAT sp_midi2cps(SPFLOAT nn){ return pow(2, (nn - 69.0) / 12.0) * 440.0;}int sp_set(sp_param *p, SPFLOAT val) { p->state = 1; p->val = val; return SP_OK;}int sp_out(sp_data *sp, uint32_t chan, SPFLOAT val){ if (chan > sp->nchan - 1) { fprintf(stderr, "sp_out: Invalid channel\n"); return SP_NOT_OK; } sp->out[chan] = val; return SP_OK;}uint32_t sp_rand(sp_data *sp){ uint32_t val = (1103515245 * sp->rand + 12345) % SP_RANDMAX; sp->rand = val; return val;}void sp_srand(sp_data *sp, uint32_t val){ sp->rand = val;}vendor/soundpipe/modules/blsaw.cadded
/* * Saw * * This code was generated by Faust. It utilizes the saw2 Faust * module coded by Julius Smith. See oscillator.lib for more details. * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"#include "CUI.h"#define max(a,b) ((a < b) ? b : a)#define min(a,b) ((a < b) ? a : b)#ifndef FAUSTFLOAT#define FAUSTFLOAT float#endifstatic float faustpower2_f(float value) { return (value * value);}typedef struct { float fRec0[2]; float fVec0[2]; float fVec1[2]; int fSamplingFreq; int iConst0; FAUSTFLOAT fHslider0; FAUSTFLOAT fHslider1; float fConst1; float fConst2;} blsaw;blsaw* newblsaw() { blsaw* dsp = (blsaw*)malloc(sizeof(blsaw)); return dsp;}void deleteblsaw(blsaw* dsp) { free(dsp);}void instanceInitblsaw(blsaw* dsp, int samplingFreq) { dsp->fSamplingFreq = samplingFreq; dsp->iConst0 = min(192000, max(1, dsp->fSamplingFreq)); dsp->fHslider0 = (FAUSTFLOAT)1.; dsp->fHslider1 = (FAUSTFLOAT)440.; dsp->fConst1 = (float)dsp->iConst0; dsp->fConst2 = (2.f / dsp->fConst1); /* C99 loop */ { int i0; for (i0 = 0; (i0 < 2); i0 = (i0 + 1)) { dsp->fRec0[i0] = 0.f; } } /* C99 loop */ { int i1; for (i1 = 0; (i1 < 2); i1 = (i1 + 1)) { dsp->fVec0[i1] = 0.f; } } /* C99 loop */ { int i2; for (i2 = 0; (i2 < 2); i2 = (i2 + 1)) { dsp->fVec1[i2] = 0.f; } }}void initblsaw(blsaw* dsp, int samplingFreq) { instanceInitblsaw(dsp, samplingFreq);}void buildUserInterfaceblsaw(blsaw* dsp, UIGlue* interface) { interface->addHorizontalSlider(interface->uiInterface, "freq", &dsp->fHslider1, 440.f, 0.f, 20000.f, 0.0001f); interface->addHorizontalSlider(interface->uiInterface, "amp", &dsp->fHslider0, 1.f, 0.f, 1.f, 0.0001f);}void computeblsaw(blsaw* dsp, int count, FAUSTFLOAT** inputs, FAUSTFLOAT** outputs) { FAUSTFLOAT* output0 = outputs[0]; float fSlow0 = (float)dsp->fHslider1; float fSlow1 = ((float)dsp->iConst0 * ((float)dsp->fHslider0 / fSlow0)); float fSlow2 = (dsp->fConst2 * fSlow0); float fSlow3 = (dsp->fConst1 / fSlow0); /* C99 loop */ { int i; for (i = 0; (i < count); i = (i + 1)) { dsp->fRec0[0] = fmod((1.f + dsp->fRec0[1]), fSlow3); float fTemp0 = faustpower2_f(((fSlow2 * dsp->fRec0[0]) - 1.f)); dsp->fVec0[0] = fTemp0; dsp->fVec1[0] = 0.25f; output0[i] = (FAUSTFLOAT)(fSlow1 * ((fTemp0 - dsp->fVec0[1]) * dsp->fVec1[1])); dsp->fRec0[1] = dsp->fRec0[0]; dsp->fVec0[1] = dsp->fVec0[0]; dsp->fVec1[1] = dsp->fVec1[0]; } }}static void addHorizontalSlider(void* ui_interface, const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step){ sp_blsaw *p = ui_interface; p->args[p->argpos] = zone; p->argpos++;}int sp_blsaw_create(sp_blsaw **p){ *p = malloc(sizeof(sp_blsaw)); return SP_OK;}int sp_blsaw_destroy(sp_blsaw **p){ sp_blsaw *pp = *p; blsaw *dsp = pp->ud; deleteblsaw (dsp); free(*p); return SP_OK;}int sp_blsaw_init(sp_data *sp, sp_blsaw *p){ blsaw *dsp = newblsaw(); UIGlue UI; p->argpos = 0; UI.addHorizontalSlider= addHorizontalSlider; UI.uiInterface = p; buildUserInterfaceblsaw(dsp, &UI); initblsaw(dsp, sp->sr); p->freq = p->args[0]; p->amp = p->args[1]; p->ud = dsp; return SP_OK;}int sp_blsaw_compute(sp_data *sp, sp_blsaw *p, SPFLOAT *in, SPFLOAT *out){ blsaw *dsp = p->ud; SPFLOAT out1 = 0; SPFLOAT *faust_out[] = {&out1}; SPFLOAT *faust_in[] = {in}; computeblsaw(dsp, 1, faust_in, faust_out); *out = out1; return SP_OK;}vendor/soundpipe/modules/blsquare.cadded
#include <math.h>#include <stdlib.h>#include "soundpipe.h"#include "CUI.h"#define max(a,b) ((a < b) ? b : a)#define min(a,b) ((a < b) ? a : b)#ifndef FAUSTFLOAT#define FAUSTFLOAT float#endiffloat fmodf(float dummy0, float dummy1);static float faustpower2_f(float value) { return (value * value);}typedef struct { float fVec2[4096]; int iVec0[2]; float fRec0[2]; float fVec1[2]; FAUSTFLOAT fHslider0; int fSamplingFreq; float fConst0; FAUSTFLOAT fHslider1; FAUSTFLOAT fHslider2; float fConst1; float fConst2; int IOTA;} blsquare;blsquare* newblsquare() { blsquare* dsp = (blsquare*)malloc(sizeof(blsquare)); return dsp;}void deleteblsquare(blsquare* dsp) { free(dsp);}void instanceInitblsquare(blsquare* dsp, int samplingFreq) { dsp->fSamplingFreq = samplingFreq; dsp->fHslider0 = (FAUSTFLOAT)1.; /* C99 loop */ { int i0; for (i0 = 0; (i0 < 2); i0 = (i0 + 1)) { dsp->iVec0[i0] = 0; } } dsp->fConst0 = (float)min(192000, max(1, dsp->fSamplingFreq)); dsp->fHslider1 = (FAUSTFLOAT)0.5; dsp->fHslider2 = (FAUSTFLOAT)440.; dsp->fConst1 = (0.25f * dsp->fConst0); dsp->fConst2 = (1.f / dsp->fConst0); /* C99 loop */ { int i1; for (i1 = 0; (i1 < 2); i1 = (i1 + 1)) { dsp->fRec0[i1] = 0.f; } } /* C99 loop */ { int i2; for (i2 = 0; (i2 < 2); i2 = (i2 + 1)) { dsp->fVec1[i2] = 0.f; } } dsp->IOTA = 0; /* C99 loop */ { int i3; for (i3 = 0; (i3 < 4096); i3 = (i3 + 1)) { dsp->fVec2[i3] = 0.f; } }}void initblsquare(blsquare* dsp, int samplingFreq) { instanceInitblsquare(dsp, samplingFreq);}void buildUserInterfaceblsquare(blsquare* dsp, UIGlue* interface) { interface->addHorizontalSlider(interface->uiInterface, "frequency", &dsp->fHslider2, 440.f, 0.f, 20000.f, 0.0001f); interface->addHorizontalSlider(interface->uiInterface, "amp", &dsp->fHslider0, 1.f, 0.f, 1.f, 1e-05f); interface->addHorizontalSlider(interface->uiInterface, "width", &dsp->fHslider1, 0.5f, 0.f, 1.f, 0.f);}void computeblsquare(blsquare* dsp, int count, FAUSTFLOAT** inputs, FAUSTFLOAT** outputs) { FAUSTFLOAT* output0 = outputs[0]; float fSlow0 = (float)dsp->fHslider0; float fSlow1 = max((float)dsp->fHslider2, 23.4489f); float fSlow2 = max(0.f, min(2047.f, (dsp->fConst0 * ((float)dsp->fHslider1 / fSlow1)))); int iSlow3 = (int)fSlow2; int iSlow4 = (1 + iSlow3); float fSlow5 = ((float)iSlow4 - fSlow2); float fSlow6 = (dsp->fConst1 / fSlow1); float fSlow7 = (dsp->fConst2 * fSlow1); float fSlow8 = (fSlow2 - (float)iSlow3); /* C99 loop */ { int i; for (i = 0; (i < count); i = (i + 1)) { dsp->iVec0[0] = 1; dsp->fRec0[0] = fmodf((dsp->fRec0[1] + fSlow7), 1.f); float fTemp0 = faustpower2_f(((2.f * dsp->fRec0[0]) - 1.f)); dsp->fVec1[0] = fTemp0; float fTemp1 = (fSlow6 * ((fTemp0 - dsp->fVec1[1]) * (float)dsp->iVec0[1])); dsp->fVec2[(dsp->IOTA & 4095)] = fTemp1; output0[i] = (FAUSTFLOAT)(fSlow0 * (0.f - (((fSlow5 * dsp->fVec2[((dsp->IOTA - iSlow3) & 4095)]) + (fSlow8 * dsp->fVec2[((dsp->IOTA - iSlow4) & 4095)])) - fTemp1))); dsp->iVec0[1] = dsp->iVec0[0]; dsp->fRec0[1] = dsp->fRec0[0]; dsp->fVec1[1] = dsp->fVec1[0]; dsp->IOTA = (dsp->IOTA + 1); } }}static void addHorizontalSlider(void* ui_interface, const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step){ sp_blsquare *p = ui_interface; p->args[p->argpos] = zone; p->argpos++;}int sp_blsquare_create(sp_blsquare **p){ *p = malloc(sizeof(sp_blsquare)); return SP_OK;}int sp_blsquare_destroy(sp_blsquare **p){ sp_blsquare *pp = *p; blsquare *dsp = pp->ud; deleteblsquare (dsp); free(*p); return SP_OK;}int sp_blsquare_init(sp_data *sp, sp_blsquare *p){ blsquare *dsp = newblsquare(); UIGlue UI; p->argpos = 0; UI.addHorizontalSlider= addHorizontalSlider; UI.uiInterface = p; buildUserInterfaceblsquare(dsp, &UI); initblsquare(dsp, sp->sr); p->freq = p->args[0]; p->amp = p->args[1]; p->width = p->args[2]; p->ud = dsp; return SP_OK;}int sp_blsquare_compute(sp_data *sp, sp_blsquare *p, SPFLOAT *in, SPFLOAT *out){ blsquare *dsp = p->ud; SPFLOAT out1 = 0; SPFLOAT *faust_out[] = {&out1}; SPFLOAT *faust_in[] = {in}; computeblsquare(dsp, 1, faust_in, faust_out); *out = out1; return SP_OK;}vendor/soundpipe/modules/bltriangle.cadded
#include <math.h>#include <stdlib.h>#include "soundpipe.h"#include "CUI.h"#define max(a,b) ((a < b) ? b : a)#define min(a,b) ((a < b) ? a : b)#ifndef FAUSTFLOAT#define FAUSTFLOAT float#endiffloat fmodf(float dummy0, float dummy1);static float faustpower2_f(float value) { return (value * value);}typedef struct { float fVec2[4096]; int iVec0[2]; float fRec1[2]; float fVec1[2]; float fRec0[2]; int fSamplingFreq; int iConst0; float fConst1; FAUSTFLOAT fHslider0; FAUSTFLOAT fHslider1; float fConst2; float fConst3; float fConst4; float fConst5; int IOTA;} bltriangle;bltriangle* newbltriangle() { bltriangle* dsp = (bltriangle*)malloc(sizeof(bltriangle)); return dsp;}void deletebltriangle(bltriangle* dsp) { free(dsp);}void instanceInitbltriangle(bltriangle* dsp, int samplingFreq) { dsp->fSamplingFreq = samplingFreq; /* C99 loop */ { int i0; for (i0 = 0; (i0 < 2); i0 = (i0 + 1)) { dsp->iVec0[i0] = 0; } } dsp->iConst0 = min(192000, max(1, dsp->fSamplingFreq)); dsp->fConst1 = (4.f / (float)dsp->iConst0); dsp->fHslider0 = (FAUSTFLOAT)440.; dsp->fHslider1 = (FAUSTFLOAT)1.; dsp->fConst2 = (float)dsp->iConst0; dsp->fConst3 = (0.5f * dsp->fConst2); dsp->fConst4 = (0.25f * dsp->fConst2); dsp->fConst5 = (1.f / dsp->fConst2); /* C99 loop */ { int i1; for (i1 = 0; (i1 < 2); i1 = (i1 + 1)) { dsp->fRec1[i1] = 0.f; } } /* C99 loop */ { int i2; for (i2 = 0; (i2 < 2); i2 = (i2 + 1)) { dsp->fVec1[i2] = 0.f; } } dsp->IOTA = 0; /* C99 loop */ { int i3; for (i3 = 0; (i3 < 4096); i3 = (i3 + 1)) { dsp->fVec2[i3] = 0.f; } } /* C99 loop */ { int i4; for (i4 = 0; (i4 < 2); i4 = (i4 + 1)) { dsp->fRec0[i4] = 0.f; } }}void initbltriangle(bltriangle* dsp, int samplingFreq) { instanceInitbltriangle(dsp, samplingFreq);}void buildUserInterfacebltriangle(bltriangle* dsp, UIGlue* interface) { interface->addHorizontalSlider(interface->uiInterface, "freq", &dsp->fHslider0, 440.f, 0.f, 20000.f, 0.0001f); interface->addHorizontalSlider(interface->uiInterface, "amp", &dsp->fHslider1, 1.f, 0.f, 1.f, 1e-05f);}void computebltriangle(bltriangle* dsp, int count, FAUSTFLOAT** inputs, FAUSTFLOAT** outputs) { FAUSTFLOAT* output0 = outputs[0]; float fSlow0 = (float)dsp->fHslider0; float fSlow1 = (dsp->fConst1 * (fSlow0 * (float)dsp->fHslider1)); float fSlow2 = max(fSlow0, 23.4489f); float fSlow3 = max(0.f, min(2047.f, (dsp->fConst3 / fSlow2))); int iSlow4 = (int)fSlow3; int iSlow5 = (1 + iSlow4); float fSlow6 = ((float)iSlow5 - fSlow3); float fSlow7 = (dsp->fConst4 / fSlow2); float fSlow8 = (dsp->fConst5 * fSlow2); float fSlow9 = (fSlow3 - (float)iSlow4); /* C99 loop */ { int i; for (i = 0; (i < count); i = (i + 1)) { dsp->iVec0[0] = 1; dsp->fRec1[0] = fmodf((dsp->fRec1[1] + fSlow8), 1.f); float fTemp0 = faustpower2_f(((2.f * dsp->fRec1[0]) - 1.f)); dsp->fVec1[0] = fTemp0; float fTemp1 = (fSlow7 * ((fTemp0 - dsp->fVec1[1]) * (float)dsp->iVec0[1])); dsp->fVec2[(dsp->IOTA & 4095)] = fTemp1; dsp->fRec0[0] = (0.f - (((fSlow6 * dsp->fVec2[((dsp->IOTA - iSlow4) & 4095)]) + (fSlow9 * dsp->fVec2[((dsp->IOTA - iSlow5) & 4095)])) - ((0.999f * dsp->fRec0[1]) + fTemp1))); output0[i] = (FAUSTFLOAT)(fSlow1 * dsp->fRec0[0]); dsp->iVec0[1] = dsp->iVec0[0]; dsp->fRec1[1] = dsp->fRec1[0]; dsp->fVec1[1] = dsp->fVec1[0]; dsp->IOTA = (dsp->IOTA + 1); dsp->fRec0[1] = dsp->fRec0[0]; } }}static void addHorizontalSlider(void* ui_interface, const char* label, FAUSTFLOAT* zone, FAUSTFLOAT init, FAUSTFLOAT min, FAUSTFLOAT max, FAUSTFLOAT step){ sp_bltriangle *p = ui_interface; p->args[p->argpos] = zone; p->argpos++;}int sp_bltriangle_create(sp_bltriangle **p){ *p = malloc(sizeof(sp_bltriangle)); return SP_OK;}int sp_bltriangle_destroy(sp_bltriangle **p){ sp_bltriangle *pp = *p; bltriangle *dsp = pp->ud; deletebltriangle (dsp); free(*p); return SP_OK;}int sp_bltriangle_init(sp_data *sp, sp_bltriangle *p){ bltriangle *dsp = newbltriangle(); UIGlue UI; p->argpos = 0; UI.addHorizontalSlider= addHorizontalSlider; UI.uiInterface = p; buildUserInterfacebltriangle(dsp, &UI); initbltriangle(dsp, sp->sr); p->freq = p->args[0]; p->amp = p->args[1]; p->ud = dsp; return SP_OK;}int sp_bltriangle_compute(sp_data *sp, sp_bltriangle *p, SPFLOAT *in, SPFLOAT *out){ bltriangle *dsp = p->ud; SPFLOAT out1 = 0; SPFLOAT *faust_out[] = {&out1}; SPFLOAT *faust_in[] = {in}; computebltriangle(dsp, 1, faust_in, faust_out); *out = out1; return SP_OK;}vendor/soundpipe/modules/brown.cadded
/* * Brown * * Brownian noise algorithm based on implementation found here: * http://vellocet.com/dsp/noise/VRand.h * * */#include <stdlib.h>#include "soundpipe.h"int sp_brown_create(sp_brown **p){ *p = malloc(sizeof(sp_brown)); return SP_OK;}int sp_brown_destroy(sp_brown **p){ free(*p); return SP_OK;}int sp_brown_init(sp_data *sp, sp_brown *p){ p->brown = 0.0; return SP_OK;}int sp_brown_compute(sp_data *sp, sp_brown *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT r; while (1) { r = (sp_rand(sp) % SP_RANDMAX) / (SPFLOAT)(SP_RANDMAX); r = ((r * 2) - 1) * 0.5; p->brown += r; if (p->brown < -8.0f || p->brown > 8.0f) { p->brown -= r; } else { break; } } *out = p->brown * 0.0625; return SP_OK;}vendor/soundpipe/modules/buthp.cadded
/* * Buthp * * This is an implementation of a 2nd-order butterworth * highpass filter, discretized using the bilinear transform. * * For more information on using the BLT on 2nd-order * butterworth filters, see: * * https://ccrma.stanford.edu/~jos/filters/Example_Second_Order_Butterworth_Lowpass.html */#include <math.h>#include <stdint.h>#include <stdlib.h>#define ROOT2 (1.4142135623730950488)#ifndef M_PI#define M_PI 3.14159265358979323846#endif#include "soundpipe.h"static int filter(SPFLOAT *in, SPFLOAT *out, SPFLOAT *a){ SPFLOAT t, y; /* a5 = t(n - 1); a6 = t(n - 2) */ t = *in - a[3]*a[5] - a[4]*a[6]; y = t*a[0] + a[1]*a[5] + a[2]*a[6]; a[6] = a[5]; a[5] = t; *out = y; return SP_OK;}int sp_buthp_create(sp_buthp **p){ *p = malloc(sizeof(sp_buthp)); return SP_OK;}int sp_buthp_destroy(sp_buthp **p){ free(*p); return SP_OK;}int sp_buthp_init(sp_data *sp, sp_buthp *p){ p->freq = 1000; p->pidsr = M_PI / sp->sr * 1.0; p->a[5] = p->a[6] = 0.0; p->lfreq = 0.0; return SP_OK;}int sp_buthp_compute(sp_data *sp, sp_buthp *p, SPFLOAT *in, SPFLOAT *out){ if (p->freq <= 0.0) { *out = 0; return SP_OK; } if (p->freq != p->lfreq) { SPFLOAT *a, c; a = p->a; p->lfreq = p->freq; /* derive C constant used in BLT */ c = tan((SPFLOAT)(p->pidsr * p->freq)); /* perform BLT, store components */ a[0] = 1.0 / (1.0 + c*ROOT2 + c*c); a[1] = -2*a[0]; a[2] = a[0]; a[3] = 2.0 * (c*c - 1.0) * a[0]; a[4] = (1.0 - c*ROOT2 + c*c) * a[0]; } filter(in, out, p->a); return SP_OK;}vendor/soundpipe/modules/butlp.cadded
/* * Butlp * * This is an implementation of a 2nd-order butterworth * lowpass filter, discretized using the bilinear transform. * * For more information on using the BLT on 2nd-order * butterworth filters, see: * * https://ccrma.stanford.edu/~jos/filters/Example_Second_Order_Butterworth_Lowpass.html */#include <math.h>#include <stdint.h>#include <stdlib.h>#define ROOT2 (1.4142135623730950488)#ifndef M_PI#define M_PI 3.14159265358979323846#endif#include "soundpipe.h"static int filter(SPFLOAT *in, SPFLOAT *out, SPFLOAT *a){ SPFLOAT t, y; /* a5 = t(n - 1); a6 = t(n - 2) */ t = *in - a[3]*a[5] - a[4]*a[6]; y = t*a[0] + a[1]*a[5] + a[2]*a[6]; a[6] = a[5]; a[5] = t; *out = y; return SP_OK;}int sp_butlp_create(sp_butlp **p){ *p = malloc(sizeof(sp_butlp)); return SP_OK;}int sp_butlp_destroy(sp_butlp **p){ free(*p); return SP_OK;}int sp_butlp_init(sp_data *sp, sp_butlp *p){ p->freq = 1000; p->pidsr = M_PI / sp->sr * 1.0; p->a[5] = p->a[6] = 0.0; p->lfreq = 0.0; return SP_OK;}int sp_butlp_compute(sp_data *sp, sp_butlp *p, SPFLOAT *in, SPFLOAT *out){ if (p->freq <= 0.0) { *out = 0; return SP_NOT_OK; } if (p->freq != p->lfreq) { SPFLOAT *a, c; a = p->a; p->lfreq = p->freq; /* derive C constant used in BLT */ c = 1.0 / tan((SPFLOAT)(p->pidsr * p->lfreq)); /* perform BLT, store components */ a[0] = 1.0 / (1.0 + c*ROOT2 + c*c); a[1] = 2*a[0]; a[2] = a[0]; a[3] = 2.0 * (1.0 - c*c) * a[0]; a[4] = (1.0 - c*ROOT2 + c*c) * a[0]; } filter(in, out, p->a); return SP_OK;}vendor/soundpipe/modules/clamp.cadded
#include <stdlib.h>#include "soundpipe.h"int sp_clamp_create(sp_clamp **p){ *p = malloc(sizeof(sp_clamp)); return SP_OK;}int sp_clamp_destroy(sp_clamp **p){ free(*p); return SP_OK;}int sp_clamp_init(sp_data *sp, sp_clamp *p){ p->min = 0; p->max = 1; return SP_OK;}int sp_clamp_compute(sp_data *sp, sp_clamp *p, SPFLOAT *in, SPFLOAT *out){ if (*in < p->min) *out = p->min; else if (*in > p->max) *out = p->max; else *out = *in; return SP_OK;}vendor/soundpipe/modules/clip.cadded
/* * Clip * * This code has been extracted from the Csound opcode "clip". * It has been modified to work as a Soundpipe module. * * Original Author(s): John ffitch, Istvan Varga, Peter Neubäcker, rasmus ekman, Phil Burk * Year: 1999 * Location: Opcodes/pitch.c * */#include <math.h>#include <stdint.h>#include <stdlib.h>#ifndef M_PI#define M_PI 3.14159265358979323846#endif#include "soundpipe.h"int sp_clip_create(sp_clip **p){ *p = malloc(sizeof(sp_clip)); return SP_OK;}int sp_clip_destroy(sp_clip **p){ free(*p); return SP_OK;}int sp_clip_init(sp_data *sp, sp_clip *p){ p->lim = 1; p->k1 = M_PI / (2.0 * p->lim); return SP_OK;}int sp_clip_compute(sp_data *sp, sp_clip *p, SPFLOAT *in, SPFLOAT *out){ p->k1 = M_PI / (2.0 * p->lim); SPFLOAT k1 = p->k1; SPFLOAT limit = p->lim; SPFLOAT x; x = *in; if (x >= limit) { x = limit; } else if (x <= -limit) { x = -limit; } else { x = limit * sin(k1 * x); } *out = x; return SP_OK;}vendor/soundpipe/modules/clock.cadded
/* * Foo * * This is a dummy module. It doesn't do much. * Feel free to use this as a boilerplate template. * */#include <stdlib.h>#include "soundpipe.h"int sp_clock_create(sp_clock **p){ *p = malloc(sizeof(sp_clock)); return SP_OK;}int sp_clock_destroy(sp_clock **p){ free(*p); return SP_OK;}int sp_clock_init(sp_data *sp, sp_clock *p){ p->subdiv = 1.0; p->bpm = 120; p->counter = 0; return SP_OK;}int sp_clock_compute(sp_data *sp, sp_clock *p, SPFLOAT *in, SPFLOAT *out){ *out = 0.0; if (p->counter == 0 || *in != 0) { *out = 1.0; p->counter = (int)(sp->sr * (60.0 / (p->bpm * p->subdiv))) + 1; } p->counter--; return SP_OK;}vendor/soundpipe/modules/crossfade.cadded
#include <stdlib.h>#include "soundpipe.h"int sp_crossfade_create(sp_crossfade **p){ *p = malloc(sizeof(sp_crossfade)); return SP_OK;}int sp_crossfade_destroy(sp_crossfade **p){ free(*p); return SP_OK;}int sp_crossfade_init(sp_data *sp, sp_crossfade *p){ p->pos = 0.5; return SP_OK;}int sp_crossfade_compute(sp_data *sp, sp_crossfade *p, SPFLOAT *in1, SPFLOAT *in2, SPFLOAT *out){ *out = *in2 * p->pos + *in1 * (1 - p->pos); return SP_OK;}vendor/soundpipe/modules/dcblock.cadded
/* * DCblock * * This code has been extracted from the Csound opcode "dcblock". * It has been modified to work as a Soundpipe module. * * Original Author(s): Perry R. Cook * Year: 1995 * Location: Opcodes/biquad.c * */#include <stdlib.h>#include "soundpipe.h"int sp_dcblock_create(sp_dcblock **p){ *p = malloc(sizeof(sp_dcblock)); return SP_OK;}int sp_dcblock_destroy(sp_dcblock **p){ free(*p); return SP_OK;}int sp_dcblock_init(sp_data *sp, sp_dcblock *p){ p->outputs = 0.0; p->inputs = 0.0; p->gain = 0.99; if (p->gain == 0.0 || p->gain>=1.0 || p->gain<=-1.0) p->gain = 0.99; return SP_OK;}int sp_dcblock_compute(sp_data *sp, sp_dcblock *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT gain = p->gain; SPFLOAT outputs = p->outputs; SPFLOAT inputs = p->inputs; SPFLOAT sample = *in; outputs = sample - inputs + (gain * outputs); inputs = sample; *out = outputs; p->outputs = outputs; p->inputs = inputs; return SP_OK;}vendor/soundpipe/modules/delay.cadded
#include <stdlib.h>#include <math.h>#include "soundpipe.h"int sp_delay_create(sp_delay **p){ *p = malloc(sizeof(sp_delay)); return SP_OK;}int sp_delay_destroy(sp_delay **p){ sp_delay *pp = *p; sp_auxdata_free(&pp->buf); free(*p); return SP_OK;}int sp_delay_init(sp_data *sp, sp_delay *p, SPFLOAT time){ p->time = time; p->bufsize = round(time * sp->sr); sp_auxdata_alloc(&p->buf, p->bufsize * sizeof(SPFLOAT)); p->bufpos = 0; p->feedback = 0; p->last = 0; return SP_OK;}int sp_delay_compute(sp_data *sp, sp_delay *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT delay = 0, sig = 0; SPFLOAT *buf = (SPFLOAT *)p->buf.ptr; delay = buf[p->bufpos]; sig = (delay * p->feedback) + *in; buf[p->bufpos] = sig; p->bufpos = (p->bufpos + 1) % p->bufsize; *out = delay; return SP_OK;}vendor/soundpipe/modules/expon.cadded
/* * Expon * * This code has been extracted from the Csound opcode "expon". * It has been modified to work as a Soundpipe module. * * Original Author(s): Barry Vercoe * Year: 1991 * Location: OOps/ugens1.c * */#include <math.h>#include <stdlib.h>#include "soundpipe.h"int sp_expon_create(sp_expon **p){ *p = malloc(sizeof(sp_expon)); return SP_OK;}int sp_expon_destroy(sp_expon **p){ free(*p); return SP_OK;}static void expon_reinit(sp_data *sp, sp_expon *p){ p->stime = 0; p->sdur = p->dur * sp->sr; SPFLOAT onedsr = 1.0 / sp->sr; if ((p->a * p->b) > 0.0) { p->incr = pow((SPFLOAT)(p->b / p->a), onedsr / p->dur); } else { fprintf(stderr, "Warning: p values must be non-zero\n"); p->incr = 1; p->val = p->a; } p->val = p->a;}int sp_expon_init(sp_data *sp, sp_expon *p){ p->a = 0.000001; p->b = 1; p->dur = 1; expon_reinit(sp, p); p->init = 1; return SP_OK;}int sp_expon_compute(sp_data *sp, sp_expon *p, SPFLOAT *in, SPFLOAT *out){ if (*in) { expon_reinit(sp, p); p->init = 0; } if (p->init) { *out = 0; return SP_OK; } if (p->stime < p->sdur) { SPFLOAT val = p->val; p->val *= p->incr; p->stime++; *out = val; } else { *out = p->b; } return SP_OK;}vendor/soundpipe/modules/fosc.cadded
/* * Fosc * * This code has been extracted from the Csound opcode "foscili". * It has been modified to work as a Soundpipe module. * * Original Author(s): Barry Vercoe, John ffitch * Year: 1991 * Location: OOps/ugens3.c * */#include <stdlib.h>#include "soundpipe.h"int sp_fosc_create(sp_fosc **p){ *p = malloc(sizeof(sp_fosc)); return SP_OK;}int sp_fosc_destroy(sp_fosc **p){ free(*p); return SP_OK;}int sp_fosc_init(sp_data *sp, sp_fosc *p, sp_ftbl *ft){ p->freq = 440; p->amp = 0.4; p->iphs = 0.0; p->ft = ft; p->mod = 1.0; p->car = 1.0; p->indx = 1.0; p->cphs = p->mphs = (int32_t)(p->iphs * SP_FT_MAXLEN); return SP_OK;}int sp_fosc_compute(sp_data *sp, sp_fosc *p, SPFLOAT *in, SPFLOAT *out){ sp_ftbl *ftp; SPFLOAT amp, cps, fract, v1, v2, car, fmod, cfreq, mod; SPFLOAT xcar, xmod, ndx, *ftab; int32_t mphs, cphs, minc, cinc, lobits; SPFLOAT sicvt = p->ft->sicvt; SPFLOAT *ft; ftp = p->ft; ft = ftp->tbl; lobits = ftp->lobits; mphs = p->mphs; cphs = p->cphs; cps = p->freq; amp = p->amp; xcar = p->car; xmod = p->mod; car = cps * xcar; mod = cps * xmod; ndx = p->indx * mod; minc = (int32_t)(mod * sicvt); mphs &= SP_FT_PHMASK; fract = ((mphs) & ftp->lomask) * ftp->lodiv; ftab = ft + (mphs >> lobits); v1 = ftab[0]; if (ftab[0] == p->ft->tbl[p->ft->size - 1]) { v2 = p->ft->tbl[0]; } else { v2 = ftab[1]; } fmod = (v1 + (v2 - v1) * fract) * ndx; mphs += minc; cfreq = car + fmod; cinc = (int32_t)(cfreq * sicvt); cphs &= SP_FT_PHMASK; fract = ((cphs) & ftp->lomask) * ftp->lodiv; ftab = ft + (cphs >>lobits); v1 = ftab[0]; if (ftab[0] == p->ft->tbl[p->ft->size - 1]) { v2 = p->ft->tbl[0]; } else { v2 = ftab[1]; } *out = (v1 + (v2 - v1) * fract) * amp; cphs += cinc; p->mphs = mphs; p->cphs = cphs; return SP_OK;}vendor/soundpipe/modules/ftbl.cadded
#include <math.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#ifndef NO_LIBSNDFILE#include <sndfile.h>#endif#include "soundpipe.h"#ifndef M_PI#define M_PI 3.14159265358979323846#endif#define tpd360 0.0174532925199433/* initialize constants in ftable */int sp_ftbl_init(sp_data *sp, sp_ftbl *ft, size_t size){ ft->size = size; ft->sicvt = 1.0 * SP_FT_MAXLEN / sp->sr; ft->lobits = log2(SP_FT_MAXLEN / size); ft->lomask = (1<<ft->lobits) - 1; ft->lodiv = 1.0 / (1<<ft->lobits); ft->del = 1; return SP_OK;}int sp_ftbl_create(sp_data *sp, sp_ftbl **ft, size_t size){ *ft = malloc(sizeof(sp_ftbl)); sp_ftbl *ftp = *ft; ftp->tbl = malloc(sizeof(SPFLOAT) * (size + 1)); memset(ftp->tbl, 0, sizeof(SPFLOAT) * (size + 1)); sp_ftbl_init(sp, ftp, size); return SP_OK;}int sp_ftbl_bind(sp_data *sp, sp_ftbl **ft, SPFLOAT *tbl, size_t size){ *ft = malloc(sizeof(sp_ftbl)); sp_ftbl *ftp = *ft; ftp->tbl = tbl; sp_ftbl_init(sp, ftp, size); ftp->del = 0; return SP_OK;}int sp_ftbl_destroy(sp_ftbl **ft){ sp_ftbl *ftp = *ft; if (ftp->del) free(ftp->tbl); free(*ft); return SP_OK;}/* TODO: handle spaces at beginning of string */static char * tokenize(char **next, int *size){ if (*size <= 0) return NULL; char *token = *next; char *str = *next; char *peak = str + 1; while ((*size)--) { if (*str == ' ') { *str = 0; if (*peak != ' ') break; } str = str + 1; peak = str + 1; } *next = peak; return token;}int sp_gen_vals(sp_data *sp, sp_ftbl *ft, const char *string){ int size = strlen(string); char *str = malloc(sizeof(char) * size + 1); strcpy(str, string); char *out; char *ptr = str; int j = 0; while (size > 0) { out = tokenize(&str, &size); if (ft->size < j + 1) { ft->tbl = realloc(ft->tbl, sizeof(SPFLOAT) * (ft->size + 2)); /* zero out new tables */ ft->tbl[ft->size] = 0; ft->tbl[ft->size + 1] = 0; ft->size++; } ft->tbl[j] = atof(out); j++; } sp_ftbl_init(sp, ft, ft->size); free(ptr); return SP_OK;}int sp_gen_sine(sp_data *sp, sp_ftbl *ft){ unsigned long i; SPFLOAT step = 2 * M_PI / ft->size; for (i = 0; i < ft->size; i++) { ft->tbl[i] = sin(i * step); } return SP_OK;}#ifndef NO_LIBSNDFILE/*TODO: add error checking, make tests */int sp_gen_file(sp_data *sp, sp_ftbl *ft, const char *filename){ SF_INFO info; memset(&info, 0, sizeof(SF_INFO)); info.format = 0; SNDFILE *snd = sf_open(filename, SFM_READ, &info);#ifdef USE_DOUBLE sf_readf_double(snd, ft->tbl, ft->size);#else sf_readf_float(snd, ft->tbl, ft->size);#endif sf_close(snd); return SP_OK;}int sp_ftbl_loadfile(sp_data *sp, sp_ftbl **ft, const char *filename){ *ft = malloc(sizeof(sp_ftbl)); sp_ftbl *ftp = *ft; SF_INFO info; memset(&info, 0, sizeof(SF_INFO)); info.format = 0; SNDFILE *snd = sf_open(filename, SFM_READ, &info); if (snd == NULL) { return SP_NOT_OK; } size_t size = info.frames * info.channels; ftp->tbl = malloc(sizeof(SPFLOAT) * (size + 1)); sp_ftbl_init(sp, ftp, size);#ifdef USE_DOUBLE sf_readf_double(snd, ftp->tbl, ftp->size);#else sf_readf_float(snd, ftp->tbl, ftp->size);#endif sf_close(snd); return SP_OK;}#endif/* port of GEN10 from Csound */int sp_gen_sinesum(sp_data *sp, sp_ftbl *ft, const char *argstring){ sp_ftbl *args; sp_ftbl_create(sp, &args, 1); sp_gen_vals(sp, args, argstring); int32_t phs; SPFLOAT amp; int32_t flen = (int32_t)ft->size; SPFLOAT tpdlen = 2.0 * M_PI / (SPFLOAT) flen; int32_t i, n; for (i = (int32_t)args->size; i > 0; i--) { amp = args->tbl[i - 1]; if (amp != 0) { for (phs = 0, n = 0; n < ft->size; n++) { ft->tbl[n] += sin(phs * tpdlen) * amp; phs += i; phs %= flen; } } } sp_ftbl_destroy(&args); return SP_OK;}int sp_gen_line(sp_data *sp, sp_ftbl *ft, const char *argstring){ uint16_t i, n = 0, seglen; SPFLOAT incr, amp = 0; SPFLOAT x1, x2, y1, y2; sp_ftbl *args; sp_ftbl_create(sp, &args, 1); sp_gen_vals(sp, args, argstring); if ((args->size % 2) == 1 || args->size == 1) { fprintf(stderr, "Error: not enough arguments for gen_line.\n"); sp_ftbl_destroy(&args); return SP_NOT_OK; } else if (args->size == 2) { for (i = 0; i < ft->size; i++) { ft->tbl[i] = args->tbl[1]; } return SP_OK; } x1 = args->tbl[0]; y1 = args->tbl[1]; for (i = 2; i < args->size; i += 2) { x2 = args->tbl[i]; y2 = args->tbl[i + 1]; if (x2 < x1) { fprintf(stderr, "Error: x coordiates must be sequential!\n"); break; } seglen = (x2 - x1); incr = (SPFLOAT)(y2 - y1) / (seglen - 1); amp = y1; while (seglen != 0) { if (n < ft->size) { ft->tbl[n] = amp; amp += incr; seglen--; n++; } else { break; } } y1 = y2; x1 = x2; } sp_ftbl_destroy(&args); return SP_OK;}int sp_gen_xline(sp_data *sp, sp_ftbl *ft, const char *argstring){ uint16_t i, n = 0, seglen; SPFLOAT mult, amp = 0; SPFLOAT x1, x2, y1, y2; sp_ftbl *args; sp_ftbl_create(sp, &args, 1); sp_gen_vals(sp, args, argstring); if ((args->size % 2) == 1 || args->size == 1) { fprintf(stderr, "Error: not enough arguments for gen_line.\n"); sp_ftbl_destroy(&args); return SP_NOT_OK; } else if (args->size == 2) { for (i = 0; i < ft->size; i++) { ft->tbl[i] = args->tbl[1]; } return SP_OK; } x1 = args->tbl[0]; y1 = args->tbl[1]; for (i = 2; i < args->size; i += 2) { x2 = args->tbl[i]; y2 = args->tbl[i + 1]; if (x2 < x1) { fprintf(stderr, "Error: x coordiates must be sequential!\n"); break; } if (y1 == 0) { y1 = 0.000001; } if (y2 == 0) { y2 = 0.000001; } seglen = (uint32_t)(x2 - x1); mult = (y2 / y1); mult = pow(mult, (SPFLOAT)1.0 / seglen); amp = y1; while (seglen != 0) { if (n < ft->size) { ft->tbl[n] = amp; amp *= mult; seglen--; n++; } else { break; } } y1 = y2; x1 = x2; } sp_ftbl_destroy(&args); return SP_OK;}static SPFLOAT gaussrand(sp_randmt *p, SPFLOAT scale){ int64_t r1 = -((int64_t)0xFFFFFFFFU * 6); int n = 12; SPFLOAT x; do { r1 += (int64_t)sp_randmt_compute(p); } while (--n); x = (SPFLOAT)r1; return (SPFLOAT)(x * ((SPFLOAT)scale * (1.0 / (3.83 * 4294967295.03125))));}int sp_gen_gauss(sp_data *sp, sp_ftbl *ft, SPFLOAT scale, uint32_t seed){ int n; sp_randmt rand; sp_randmt_seed(&rand, NULL, seed); for (n = 0; n < ft->size; n++) { ft->tbl[n] = gaussrand(&rand, scale); } return SP_OK;}/* based off of GEN 19 */int sp_gen_composite(sp_data *sp, sp_ftbl *ft, const char *argstring){ SPFLOAT phs, inc, amp, dc, tpdlen = 2 * M_PI/ (SPFLOAT) ft->size; int i, n; sp_ftbl *args; sp_ftbl_create(sp, &args, 1); sp_gen_vals(sp, args, argstring); for (n = 0; n < args->size; n += 4) { inc = args->tbl[n] * tpdlen; amp = args->tbl[n + 1]; phs = args->tbl[n + 2] * tpd360; dc = args->tbl[n + 3]; for (i = 0; i <ft->size ; i++) { ft->tbl[i] += (SPFLOAT) (sin(phs) * amp + dc); if ((phs += inc) >= 2 * M_PI) phs -= 2 * M_PI; } } sp_ftbl_destroy(&args); return SP_OK;}int sp_gen_rand(sp_data *sp, sp_ftbl *ft, const char *argstring){ sp_ftbl *args; sp_ftbl_create(sp, &args, 1); sp_gen_vals(sp, args, argstring); int n, pos = 0, i, size = 0; for (n = 0; n < args->size; n += 2) { size = round(ft->size * args->tbl[n + 1]); for (i = 0; i < size; i++) { if (pos < ft->size) { ft->tbl[pos] = args->tbl[n]; pos++; } } } if (pos <= ft->size) { ft->size = pos; } sp_ftbl_destroy(&args); return SP_OK;}int sp_gen_triangle(sp_data *sp, sp_ftbl *ft){ unsigned int i; unsigned int counter; SPFLOAT incr; int step; incr = 1.0f / (SPFLOAT)ft->size; incr *= 2; step = 1; counter = 0; for (i = 0; i < ft->size; i++) { if (i == ft->size / 2) { step = -1; } ft->tbl[i] = (2.f*(counter * incr) - 1.f); counter += step; } return SP_OK;}vendor/soundpipe/modules/line.cadded
#include <stdlib.h>#include "soundpipe.h"int sp_line_create(sp_line **p){ *p = malloc(sizeof(sp_line)); return SP_OK;}int sp_line_destroy(sp_line **p){ free(*p); return SP_OK;}static void line_reinit(sp_data *sp, sp_line *p){ SPFLOAT onedsr = 1.0 / sp->sr; p->incr = (SPFLOAT)((p->b - p->a) / (p->dur)) * onedsr; p->val = p->a; p->stime = 0; p->sdur = sp->sr * p->dur;}int sp_line_init(sp_data *sp, sp_line *p){ p->a = 0; p->dur = 0.5; p->b = 1; line_reinit(sp, p); p->init = 1; return SP_OK;}int sp_line_compute(sp_data *sp, sp_line *p, SPFLOAT *in, SPFLOAT *out){ if (*in != 0 ) { line_reinit(sp, p); p->init = 0; } if (p->init) { *out = 0; return SP_OK; } if (p->stime < p->sdur) { SPFLOAT val = p->val; p->val += p->incr; p->stime++; *out = val; } else { *out = p->b; } return SP_OK;}vendor/soundpipe/modules/lpf18.cadded
/* * LPF18 * * This code has been extracted from the Csound opcode "lpf18". * It has been modified to work as a Soundpipe module. * * Original Author(s): John ffitch, Josep Comajuncosas * Year: 2000 * Location: Opcodes/pitch.c * */#include <math.h>#include <stdlib.h>#include "soundpipe.h"int sp_lpf18_create(sp_lpf18 **p){ *p = malloc(sizeof(sp_lpf18)); return SP_OK;}int sp_lpf18_destroy(sp_lpf18 **p){ free(*p); return SP_OK;}int sp_lpf18_init(sp_data *sp, sp_lpf18 *p){ p->cutoff = 1000; p->res = 0.8; p->dist = 2; p->ay1 = 0.0; p->ay2 = 0.0; p->aout = 0.0; p->lastin = 0.0; p->onedsr = 1.0 / sp->sr; return SP_OK;}int sp_lpf18_compute(sp_data *sp, sp_lpf18 *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT ay1 = p->ay1; SPFLOAT ay2 = p->ay2; SPFLOAT aout = p->aout; SPFLOAT lastin = p->lastin; double value = 0.0; int flag = 1; SPFLOAT lfc=0, lrs=0, kres=0, kfcn=0, kp=0, kp1=0, kp1h=0; double lds = 0.0; SPFLOAT fco, res, dist; SPFLOAT ax1 = lastin; SPFLOAT ay11 = ay1; SPFLOAT ay31 = ay2; fco = p->cutoff; res = p->res; dist = p->dist; if (fco != lfc || flag) { lfc = fco; kfcn = 2.0 * fco * p->onedsr; kp = ((-2.7528 * kfcn + 3.0429) * kfcn + 1.718) * kfcn - 0.9984; kp1 = kp + 1.0; kp1h = 0.5 * kp1; flag = 1; } if (res != lrs || flag) { lrs = res; kres = res * (((-2.7079 * kp1 + 10.963) * kp1 - 14.934) * kp1 + 8.4974); flag = 1; } if (dist != lds || flag) { lds = dist; value = 1.0 + (dist * (1.5 + 2.0 * res * (1.0 - kfcn))); } flag = 0; lastin = *in - tanh(kres*aout); ay1 = kp1h * (lastin + ax1) - kp * ay1; ay2 = kp1h * (ay1 + ay11) - kp * ay2; aout = kp1h * (ay2 + ay31) - kp * aout; *out = tanh(aout * value); p->ay1 = ay1; p->ay2 = ay2; p->aout = aout; p->lastin = lastin; return SP_OK;}vendor/soundpipe/modules/metro.cadded
/* * Metro * * Metro produces a signal steady sequence of impulses, * which is typically used as a clock signal to for other * modules. * * Metro is very similar to the "metro" object in puredata, * except that the rate parameter unit is supplied in Hz, * not ms. */#include <stdlib.h>#include "soundpipe.h"int sp_metro_create(sp_metro **p){ *p = malloc(sizeof(sp_metro)); return SP_OK;}int sp_metro_destroy(sp_metro **p){ free(*p); return SP_OK;}int sp_metro_init(sp_data *sp, sp_metro *p){ p->freq = 2.0; p->phs = 0; p->init = 1; p->onedsr = 1.0 / sp->sr; return SP_OK;}int sp_metro_compute(sp_data *sp, sp_metro *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT phs; phs = p->phs; *out = 0; if (p->init) { *out = 1.0; p->init = 0; } else { phs += p->freq * p->onedsr; if (phs >= 1) { *out = 1.0; phs -= 1.0; } } p->phs = phs; return SP_OK;}vendor/soundpipe/modules/moogladder.cadded
/* * Moogladder * * This code has been extracted from the Csound opcode "Moogladder". * It has been modified to work as a Soundpipe module. * * Original Author(s): Victor Lazzarini * Year: 2001 * Location: Opcodes/newfils.c */#include <stdint.h>#include <stdlib.h>#include <math.h>#include "soundpipe.h"#ifndef M_PI#define M_PI 3.14159265358979323846#endif#define SPFLOAT2LONG(x) lrintf(x)/* John ffitch tanh function to speed up inner loop */static double my_tanh(double x){ /* use the fact that tanh(-x) = - tanh(x) and if x>~4 tanh is approx constant 1 and for small x tanh(x) =~ x So giving a cheap approximation */ int sign = 1; if (x<0) { sign=-1; x= -x; } if (x>=4.0) { return sign; } if (x<0.5) return x*sign; return sign*tanh(x);}int sp_moogladder_create(sp_moogladder **t){ *t = malloc(sizeof(sp_moogladder)); return SP_OK;}int sp_moogladder_destroy(sp_moogladder **t){ free(*t); return SP_OK;}int sp_moogladder_init(sp_data *sp, sp_moogladder *p){ p->istor = 0.0; p->res = 0.4; p->freq = 1000; int i; if (p->istor == 0.0) { for (i = 0; i < 6; i++) p->delay[i] = 0.0; for (i = 0; i < 3; i++) p->tanhstg[i] = 0.0; p->oldfreq = 0.0; p->oldres = -1.0; /* ensure calculation on first cycle */ } return SP_OK;}int sp_moogladder_compute(sp_data *sp, sp_moogladder *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT freq = p->freq; SPFLOAT res = p->res; SPFLOAT res4; SPFLOAT *delay = p->delay; SPFLOAT *tanhstg = p->tanhstg; SPFLOAT stg[4], input; SPFLOAT acr, tune;#define THERMAL (0.000025) /* (1.0 / 40000.0) transistor thermal voltage */ int j, k; if (res < 0) res = 0; if (p->oldfreq != freq || p->oldres != res) { SPFLOAT f, fc, fc2, fc3, fcr; p->oldfreq = freq; /* sr is half the actual filter sampling rate */ fc = (SPFLOAT)(freq/sp->sr); f = 0.5*fc; fc2 = fc*fc; fc3 = fc2*fc; /* frequency & amplitude correction */ fcr = 1.8730*fc3 + 0.4955*fc2 - 0.6490*fc + 0.9988; acr = -3.9364*fc2 + 1.8409*fc + 0.9968; tune = (1.0 - exp(-((2 * M_PI)*f*fcr))) / THERMAL; /* filter tuning */ p->oldres = res; p->oldacr = acr; p->oldtune = tune; } else { res = p->oldres; acr = p->oldacr; tune = p->oldtune; } res4 = 4.0*(SPFLOAT)res*acr; /* oversampling */ for (j = 0; j < 2; j++) { /* filter stages */ input = *in - res4 /*4.0*res*acr*/ *delay[5]; delay[0] = stg[0] = delay[0] + tune*(my_tanh(input*THERMAL) - tanhstg[0]); for (k = 1; k < 4; k++) { input = stg[k-1]; stg[k] = delay[k] + tune*((tanhstg[k-1] = my_tanh(input*THERMAL)) - (k != 3 ? tanhstg[k] : my_tanh(delay[k]*THERMAL))); delay[k] = stg[k]; } /* 1/2-sample delay for phase compensation */ delay[5] = (stg[3] + delay[4])*0.5; delay[4] = stg[3]; } *out = (SPFLOAT) delay[5]; return SP_OK;}vendor/soundpipe/modules/noise.cadded
#include <math.h>#include <stdlib.h>#include "soundpipe.h"int sp_noise_create(sp_noise **ns){ *ns = malloc(sizeof(sp_noise)); return SP_OK;}int sp_noise_init(sp_data *sp, sp_noise *ns){ ns->amp = 1.0; return SP_OK;}int sp_noise_compute(sp_data *sp, sp_noise *ns, SPFLOAT *in, SPFLOAT *out){ *out = ((sp_rand(sp) % SP_RANDMAX) / (SP_RANDMAX * 1.0)); *out = (*out * 2) - 1; *out *= ns->amp; return SP_OK;}int sp_noise_destroy(sp_noise **ns){ free(*ns); return SP_OK;}vendor/soundpipe/modules/osc.cadded
/* * Osc * * This code has been extracted from the Csound opcode "oscili". * It has been modified to work as a Soundpipe module. * * Original Author(s): Barry Vercoe, John FFitch, Robin Whittle * Year: 1991 * Location: OOps/ugens2.c * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"int sp_osc_create(sp_osc **osc){ *osc = malloc(sizeof(sp_osc)); return SP_OK;}int sp_osc_destroy(sp_osc **osc){ free(*osc); return SP_NOT_OK;}int sp_osc_init(sp_data *sp, sp_osc *osc, sp_ftbl *ft, SPFLOAT iphs){ osc->freq = 440.0; osc->amp = 0.2; osc->tbl = ft; osc->iphs = fabs(iphs); osc->inc = 0; if (osc->iphs >= 0) { osc->lphs = ((int32_t)(osc->iphs * SP_FT_MAXLEN)) & SP_FT_PHMASK; } return SP_OK;}int sp_osc_compute(sp_data *sp, sp_osc *osc, SPFLOAT *in, SPFLOAT *out){ sp_ftbl *ftp; SPFLOAT amp, cps, fract, v1, v2, *ft; int32_t phs, lobits; int32_t pos; SPFLOAT sicvt = osc->tbl->sicvt; ftp = osc->tbl; lobits = osc->tbl->lobits; amp = osc->amp; cps = osc->freq; phs = osc->lphs; ft = osc->tbl->tbl; osc->inc = (int32_t)lrintf(cps * sicvt); fract = ((phs) & ftp->lomask) * ftp->lodiv; pos = phs>>lobits; v1 = *(ft + pos); v2 = *(ft + ((pos + 1) % ftp->size)); *out = (v1 + (v2 - v1) * fract) * amp; phs += osc->inc; phs &= SP_FT_PHMASK; osc->lphs = phs; return SP_OK;}vendor/soundpipe/modules/pan2.cadded
/* * Pan2 * * This code has been extracted from the Csound opcode "pan2" * It has been modified to work as a Soundpipe module. * * Original Author(s): John ffitch * Year: 2007 * Location: Opcodes/pan2.c * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"#ifndef M_PI#define M_PI 3.14159265358979323846#endif#define SQRT2 1.41421356237309504880int sp_pan2_create(sp_pan2 **p){ *p = malloc(sizeof(sp_pan2)); return SP_OK;}int sp_pan2_destroy(sp_pan2 **p){ free(*p); return SP_OK;}int sp_pan2_init(sp_data *sp, sp_pan2 *p){ p->type = 0; p->pan = 0; return SP_OK;}int sp_pan2_compute(sp_data *sp, sp_pan2 *p, SPFLOAT *in, SPFLOAT *out1, SPFLOAT *out2){ /* Send the signal's input to the output */ uint32_t type = p->type; SPFLOAT pan = (1 + p->pan) * 0.5; SPFLOAT cc, ss, l, r; type %= 4; switch (type) { /* Equal power */ case 0: pan = M_PI * 0.5 * pan; *out1 = *in * cos(pan); *out2 = *in * sin(pan); break; /* Square root */ case 1: *out1 = *in * sqrt(pan); *out2 = *in * sqrt(1.0 - pan); break; /* simple linear */ case 2: *out1 = *in * (1.0 - pan); *out2 = *in * pan; break; /* Equal power (alternative) */ case 3: cc = cos(M_PI * pan * 0.5); ss = sin(M_PI * pan * 0.5); l = SQRT2 * (cc + ss) * 0.5; r = SQRT2 * (cc - ss) * 0.5; *out1 = *in * l; *out2 = *in * r; break; } return SP_OK;}vendor/soundpipe/modules/peaklim.cadded
#include <stdlib.h>#include <math.h>#include "soundpipe.h"#ifndef max#define max(a,b) (((a) > (b)) ? (a) : (b))#endif#ifndef min#define min(a,b) (((a) < (b)) ? (a) : (b))#endif#ifndef dB/* if below -100dB, set to -100dB to prevent taking log of zero */#define dB(x) 20.0 * ((x) > 0.00001 ? log10(x) : log10(0.00001))#endif#ifndef dB2lin#define dB2lin(x) pow( 10.0, (x) / 20.0 )#endifint sp_peaklim_create(sp_peaklim **p){ *p = malloc(sizeof(sp_peaklim)); return SP_OK;}int sp_peaklim_destroy(sp_peaklim **p){ free(*p); return SP_OK;}int sp_peaklim_init(sp_data *sp, sp_peaklim *p){ p->a1_r = 0; p->b0_r = 1; p->a1_a = 0; p->b0_a = 1; p->atk = 0.1; p->rel = 0.1; p->patk = -100; p->prel = -100; p->level = 0; return SP_OK;}int sp_peaklim_compute(sp_data *sp, sp_peaklim *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT db_gain = 0; SPFLOAT gain = 0; /* change coefficients, if needed */ if (p->patk != p->atk) { p->patk = p->atk; p->a1_a = exp( -1.0 / ( p->rel * sp->sr ) ); p->b0_a = 1 - p->a1_a; } if (p->prel != p->rel) { p->prel = p->rel; p->a1_r = exp( -1.0 / ( p->rel * sp->sr ) ); p->b0_r = 1 - p->a1_r; } if ( fabs(*in) > p->level) p->level += p->b0_a * ( fabs(*in) - p->level); else p->level += p->b0_r * ( fabs(*in) - p->level); db_gain = min(0.0, dB(dB2lin(p->thresh)/p->level)); gain = dB2lin(db_gain); *out = *in * gain; return SP_OK;}vendor/soundpipe/modules/phasor.cadded
/* * Phasor * * A phasor produces a non-bandlimited sawtooth wave, * normalized to be in range 0-1. Phasors are most * frequently used to create table-lookup oscillators. */#include <stdlib.h>#include "soundpipe.h"int sp_phasor_create(sp_phasor **p){ *p = malloc(sizeof(sp_phasor)); return SP_OK;}int sp_phasor_destroy(sp_phasor **p){ free(*p); return SP_OK;}int sp_phasor_init(sp_data *sp, sp_phasor *p, SPFLOAT iphs){ p->freq = 440; p->phs = iphs; p->onedsr = 1.0 / sp->sr; return SP_OK;}int sp_phasor_compute(sp_data *sp, sp_phasor *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT phs; SPFLOAT incr; phs = p->phs; incr = p->freq * p->onedsr; *out = phs; phs += incr; if (phs >= 1.0) { phs -= 1.0; } else if (phs < 0.0) { phs += 1.0; } p->phs = phs; return SP_OK;}vendor/soundpipe/modules/pinknoise.cadded
/* * Pinknoise * * This code has been extracted the pink noise synthesizer from Protrekkr * It has been modified to work as a Soundpipe module. * * Original Author(s): McCartney, Juan Antonio Arguelles * Location: release/distrib/replay/lib/replay.cpp * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"static uint32_t ctz[64] ={ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,};int sp_pinknoise_create(sp_pinknoise **p){ *p = malloc(sizeof(sp_pinknoise)); return SP_OK;}int sp_pinknoise_destroy(sp_pinknoise **p){ free(*p); return SP_OK;}int sp_pinknoise_init(sp_data *sp, sp_pinknoise *p){ int i; p->amp = 1.0; p->seed = sp_rand(sp); p->total = 0; p->counter = 0; for (i = 0; i < 7; i++) p->dice[i] = 0; return SP_OK;}int sp_pinknoise_compute(sp_data *sp, sp_pinknoise *p, SPFLOAT *in, SPFLOAT *out){ uint32_t k = ctz[p->counter & 63]; p->prevrand = p->dice[k]; p->seed = 1664525 * p->seed + 1013904223; p->newrand = p->seed >> 3; p->dice[k] = p->newrand; p->total += (p->newrand - p->prevrand); p->seed = 1103515245 * p->seed + 12345; p->newrand = p->seed >> 3; short tmp = (short) ((((p->total + p->newrand) * (1.0f / (3 << 29)) - 1) - .25f) * 16384.0f); *out = ((SPFLOAT) tmp / 32767) * p->amp; p->counter = (p->counter + 1) % 0xFFFFFFFF; return SP_OK;}vendor/soundpipe/modules/port.cadded
/* * Port * * Port is a one-pole smoothing filter, typically used on * control signals to create a "portamenteau" effect. * * This filter design uses the difference equation: * * y(n) = b0*x(n) - a1*y(n - 1) * * Where a1 is (0.5^(1/(t * sr))), and b0 is (1 - a1). * * More information on one-pole smoothers can be found here: * https://ccrma.stanford.edu/~jos/filters/One_Pole.html */#include <math.h>#include <stdint.h>#include <stdlib.h>#include "soundpipe.h"int sp_port_create(sp_port **p){ *p = malloc(sizeof(sp_port)); return SP_OK;}int sp_port_destroy(sp_port **p){ free(*p); return SP_OK;}int sp_port_init(sp_data *sp, sp_port *p){ p->y0 = 0; p->b0 = 0; p->a1 = 0; p->psmooth = -100.0; p->smooth = 0.01; /* using this constant shaves off a multiply operation */ p->onedsr = 1.0/sp->sr; return SP_OK;}int sp_port_compute(sp_data *sp, sp_port *p, SPFLOAT *in, SPFLOAT *out){ if (p->psmooth != p->smooth) { p->a1 = pow(0.5, p->onedsr/p->smooth); p->b0 = 1.0 - p->a1; p->psmooth = p->smooth; } p->y0 = p->b0 * (*in) + p->a1 * p->y0; *out = p->y0; return SP_OK;}int sp_port_reset(sp_data *sp, sp_port *p, SPFLOAT *in){ p->y0 = *in; return SP_OK;}vendor/soundpipe/modules/posc3.cadded
/* * posc3 * * This code has been extracted from the Csound opcode "poscil3". * It has been modified to work as a Soundpipe module. * * Original Author(s): Gabriel Maldonado, John ffitch * Year: 1998 * Location: Opcodes/uggab.c * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"int sp_posc3_create(sp_posc3 **posc3){ *posc3 = malloc(sizeof(sp_posc3)); return SP_OK;}int sp_posc3_destroy(sp_posc3 **posc3){ free(*posc3); return SP_NOT_OK;}int sp_posc3_init(sp_data *sp, sp_posc3 *posc3, sp_ftbl *ft){ posc3->amp = 0.2; posc3->freq = 440.0; posc3->iphs = 0.0; posc3->onedsr = 1.0 / sp->sr; posc3->tbl = ft; posc3->tablen = (int32_t) ft->size; posc3->tablenUPsr = posc3->tablen * posc3->onedsr; posc3->phs = posc3->iphs * posc3->tablen; return SP_OK;}int sp_posc3_compute(sp_data *sp, sp_posc3 *posc3, SPFLOAT *in, SPFLOAT *out){ SPFLOAT *ftab; SPFLOAT fract; SPFLOAT phs = posc3->phs; SPFLOAT si = posc3->freq * posc3->tablen * posc3->onedsr; SPFLOAT amp = posc3->amp; int x0; SPFLOAT y0, y1, ym1, y2; ftab = posc3->tbl->tbl; x0 = (int32_t )phs; fract = (SPFLOAT)(phs - (SPFLOAT)x0); x0--; if (x0 < 0) { ym1 = ftab[posc3->tablen-1]; x0 = 0; } else ym1 = ftab[x0++]; y0 = ftab[x0++]; y1 = ftab[x0++]; if (x0>posc3->tablen) y2 = ftab[1]; else y2 = ftab[x0]; { SPFLOAT frsq = fract*fract; SPFLOAT frcu = frsq*ym1; SPFLOAT t1 = y2 + y0+y0+y0; *out = amp * (y0 + 0.5 *frcu + fract*(y1 - frcu/6.0 - t1/6.0 - ym1/3.0) + frsq*fract*(t1/6.0 - 0.5*y1) + frsq*(0.5* y1 - y0)); } phs += si; while (phs >= posc3->tablen) { phs -= posc3->tablen; } while (phs < 0.0) { phs += posc3->tablen; posc3->phs = phs; } posc3->phs = phs; return SP_OK;}vendor/soundpipe/modules/randh.cadded
#include <stdlib.h>#include "soundpipe.h"int sp_randh_create(sp_randh **p){ *p = malloc(sizeof(sp_randh)); return SP_OK;}int sp_randh_destroy(sp_randh **p){ free(*p); return SP_OK;}int sp_randh_init(sp_data *sp, sp_randh *p){ p->counter = 0; p->freq = 10; p->dur = (sp->sr / p->freq); p->min = 0; p->max = 1; p->val = 0; return SP_OK;}int sp_randh_compute(sp_data *sp, sp_randh *p, SPFLOAT *in, SPFLOAT *out){ if (p->counter == 0) { p->val = p->min + ((SPFLOAT) sp_rand(sp) / SP_RANDMAX) * (p->max - p->min); if (p->freq == 0) { p->dur = 1; } else { p->dur = (sp->sr / p->freq) + 1; } *out = p->val; } else { *out = p->val; } p->counter = (p->counter + 1) % p->dur; return SP_OK;}vendor/soundpipe/modules/randi.cadded
/* * Randi * * This code has been extracted from the Csound opcode "randi". * It has been modified to work as a Soundpipe module. * * Original Author(s): Barry Vercoe, John ffitch * Year: 1991 * Location: OOps/ugens4.c * * Randi needs the ftbl Soundpipe module in order to work. * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"#define sp_oneUp31Bit (4.656612875245796924105750827168e-10)#define sp_randGab ((SPFLOAT) \ (((p->holdrand = p->holdrand * 214013 + 2531011) >> 1) \ & 0x7fffffff) * sp_oneUp31Bit)int sp_randi_create(sp_randi **p){ *p = malloc(sizeof(sp_randi)); return SP_OK;}int sp_randi_destroy(sp_randi **p){ free(*p); return SP_OK;}int sp_randi_init(sp_data *sp, sp_randi *p){ p->sicvt = 1.0 * SP_FT_MAXLEN / sp->sr; p->phs = 0; p->min = 0; p->max = 1; p->cps = 3; p->mode = 3; p->holdrand = sp_rand(sp); p->fstval = 0; int mode = (int)(p->mode); switch (mode) { case 1: /* immediate interpolation between kmin and 1st random number */ p->num1 = 0.0; p->num2 = sp_randGab; p->dfdmax = (p->num2 - p->num1) / SP_FT_MAXLEN * 1.0; break; case 2: /* immediate interpolation between ifirstval and 1st random number */ p->num1 = (p->max - p->min) ? (p->fstval - p->min) / (p->max - p->min) : 0.0; p->num2 = sp_randGab; p->dfdmax = (p->num2 - p->num1) / SP_FT_MAXLEN * 1.0; break; case 3: /* immediate interpolation between 1st and 2nd random number */ p->num1 = sp_randGab; p->num2 = sp_randGab; p->dfdmax = (p->num2 - p->num1) / SP_FT_MAXLEN * 1.0; break; default: /* old behaviour as developped by Gabriel */ p->num1 = p->num2 = 0.0; p->dfdmax = 0.0; } return SP_OK;}int sp_randi_compute(sp_data *sp, sp_randi *p, SPFLOAT *in, SPFLOAT *out){ int32_t phs = p->phs, inc; SPFLOAT cpsp; SPFLOAT amp, min; cpsp = p->cps; min = p->min; amp = (p->max - min); inc = (int32_t)(cpsp * p->sicvt); *out = (p->num1 + (SPFLOAT)phs * p->dfdmax) * amp + min; phs += inc; if (phs >= SP_FT_MAXLEN) { phs &= SP_FT_PHMASK; p->num1 = p->num2; p->num2 = sp_randGab; p->dfdmax = 1.0 * (p->num2 - p->num1) / SP_FT_MAXLEN; } p->phs = phs; return SP_OK;}vendor/soundpipe/modules/randmt.cadded
/* A C-program for MT19937, with initialisation improved 2002/1/26. Coded by Takuji Nishimura and Makoto Matsumoto. Before using, initialise the state by using csoundSeedRandMT(). Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Any feedback is very welcome. http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space)*/#include "soundpipe.h"#define N (624)#define M (397)#define MATRIX_A 0x9908B0DFU /* constant vector a */#define UPPER_MASK 0x80000000U /* most significant w-r bits */#define LOWER_MASK 0x7FFFFFFFU /* least significant r bits */static void MT_update_state(uint32_t *mt){ /* mag01[x] = x * MATRIX_A for x=0,1 */ const uint32_t mag01[2] = { (uint32_t) 0, (uint32_t) MATRIX_A }; int i; uint32_t y; for (i = 0; i < (N - M); i++) { y = (mt[i] & UPPER_MASK) | (mt[i + 1] & LOWER_MASK); mt[i] = mt[i + M] ^ (y >> 1) ^ mag01[y & (uint32_t) 1]; } for ( ; i < (N - 1); i++) { y = (mt[i] & UPPER_MASK) | (mt[i + 1] & LOWER_MASK); mt[i] = mt[i + (M - N)] ^ (y >> 1) ^ mag01[y & (uint32_t) 1]; } y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK); mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & (uint32_t) 1];}/* generates a random number on [0,0xffffffff]-interval */uint32_t sp_randmt_compute(sp_randmt *p){ int i = p->mti; uint32_t y; if (i >= N) { /* generate N words at one time */ MT_update_state(&(p->mt[0])); i = 0; } y = p->mt[i]; p->mti = i + 1; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & (uint32_t) 0x9D2C5680U; y ^= (y << 15) & (uint32_t) 0xEFC60000U; y ^= (y >> 18); return y;}void sp_randmt_seed(sp_randmt *p, const uint32_t *initKey, uint32_t keyLength){ int i, j, k; uint32_t x; /* if array is NULL, use length parameter as simple 32 bit seed */ x = (initKey == NULL ? keyLength : (uint32_t) 19650218); p->mt[0] = x; for (i = 1; i < N; i++) { /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ /* In the previous versions, MSBs of the seed affect */ /* only MSBs of the array mt[]. */ /* 2002/01/09 modified by Makoto Matsumoto */ x = ((uint32_t) 1812433253 * (x ^ (x >> 30)) + (uint32_t) i); p->mt[i] = x; } p->mti = N; if (initKey == NULL) return; i = 0; j = 0; k = (N > (int) keyLength ? N : (int) keyLength); for ( ; k; k--) { x = p->mt[i++]; p->mt[i] = (p->mt[i] ^ ((x ^ (x >> 30)) * (uint32_t) 1664525)) + initKey[j] + (uint32_t) j; /* non linear */ if (i == (N - 1)) { p->mt[0] = p->mt[N - 1]; i = 0; } if (++j >= (int) keyLength) j = 0; } for (k = (N - 1); k; k--) { x = p->mt[i++]; p->mt[i] = (p->mt[i] ^ ((x ^ (x >> 30)) * (uint32_t) 1566083941)) - (uint32_t) i; /* non linear */ if (i == (N - 1)) { p->mt[0] = p->mt[N - 1]; i = 0; } } /* MSB is 1; assuring non-zero initial array */ p->mt[0] = (uint32_t) 0x80000000U;}vendor/soundpipe/modules/revsc.cadded
/* * RevSC * * This code has been extracted from the Csound opcode "reverbsc". * It has been modified to work as a Soundpipe module. * * Original Author(s): Sean Costello, Istvan Varga * Year: 1999, 2005 * Location: Opcodes/reverbsc.c * */#include <math.h>#include <stdlib.h>#include <stdint.h>#include <string.h>#include "soundpipe.h"#define DEFAULT_SRATE 44100.0#define MIN_SRATE 5000.0#define MAX_SRATE 1000000.0#define MAX_PITCHMOD 20.0#define DELAYPOS_SHIFT 28#define DELAYPOS_SCALE 0x10000000#define DELAYPOS_MASK 0x0FFFFFFF#ifndef M_PI#define M_PI 3.14159265358979323846 /* pi */#endif/* reverbParams[n][0] = delay time (in seconds) *//* reverbParams[n][1] = random variation in delay time (in seconds) *//* reverbParams[n][2] = random variation frequency (in 1/sec) *//* reverbParams[n][3] = random seed (0 - 32767) */static const SPFLOAT reverbParams[8][4] = { { (2473.0 / DEFAULT_SRATE), 0.0010, 3.100, 1966.0 }, { (2767.0 / DEFAULT_SRATE), 0.0011, 3.500, 29491.0 }, { (3217.0 / DEFAULT_SRATE), 0.0017, 1.110, 22937.0 }, { (3557.0 / DEFAULT_SRATE), 0.0006, 3.973, 9830.0 }, { (3907.0 / DEFAULT_SRATE), 0.0010, 2.341, 20643.0 }, { (4127.0 / DEFAULT_SRATE), 0.0011, 1.897, 22937.0 }, { (2143.0 / DEFAULT_SRATE), 0.0017, 0.891, 29491.0 }, { (1933.0 / DEFAULT_SRATE), 0.0006, 3.221, 14417.0 }};static int delay_line_max_samples(SPFLOAT sr, SPFLOAT iPitchMod, int n);static int init_delay_line(sp_revsc *p, sp_revsc_dl *lp, int n);static int delay_line_bytes_alloc(SPFLOAT sr, SPFLOAT iPitchMod, int n);static const SPFLOAT outputGain = 0.35;static const SPFLOAT jpScale = 0.25;int sp_revsc_create(sp_revsc **p){ *p = malloc(sizeof(sp_revsc)); return SP_OK;}int sp_revsc_init(sp_data *sp, sp_revsc *p){ p->iSampleRate = sp->sr; p->sampleRate = sp->sr; p->feedback = 0.97; p->lpfreq = 10000; p->iPitchMod = 1; p->iSkipInit = 0; p->dampFact = 1.0; p->prv_LPFreq = 0.0; p->initDone = 1; int i, nBytes = 0; for (i = 0; i < 8; i++) { nBytes += delay_line_bytes_alloc(sp->sr, 1, i); } sp_auxdata_alloc(&p->aux, nBytes); nBytes = 0; for (i = 0; i < 8; i++) { p->delayLines[i].buf = (p->aux.ptr) + nBytes; init_delay_line(p, &p->delayLines[i], i); nBytes += delay_line_bytes_alloc(sp->sr, 1, i); } return SP_OK;}int sp_revsc_destroy(sp_revsc **p){ sp_revsc *pp = *p; sp_auxdata_free(&pp->aux); free(*p); return SP_OK;}static int delay_line_max_samples(SPFLOAT sr, SPFLOAT iPitchMod, int n){ SPFLOAT maxDel; maxDel = reverbParams[n][0]; maxDel += (reverbParams[n][1] * (SPFLOAT) iPitchMod * 1.125); return (int) (maxDel * sr + 16.5);}static int delay_line_bytes_alloc(SPFLOAT sr, SPFLOAT iPitchMod, int n){ int nBytes = 0; nBytes += (delay_line_max_samples(sr, iPitchMod, n) * (int) sizeof(SPFLOAT)); return nBytes;}static void next_random_lineseg(sp_revsc *p, sp_revsc_dl *lp, int n){ SPFLOAT prvDel, nxtDel, phs_incVal; /* update random seed */ if (lp->seedVal < 0) lp->seedVal += 0x10000; lp->seedVal = (lp->seedVal * 15625 + 1) & 0xFFFF; if (lp->seedVal >= 0x8000) lp->seedVal -= 0x10000; /* length of next segment in samples */ lp->randLine_cnt = (int) ((p->sampleRate / reverbParams[n][2]) + 0.5); prvDel = (SPFLOAT) lp->writePos; prvDel -= ((SPFLOAT) lp->readPos + ((SPFLOAT) lp->readPosFrac / (SPFLOAT) DELAYPOS_SCALE)); while (prvDel < 0.0) prvDel += lp->bufferSize; prvDel = prvDel / p->sampleRate; /* previous delay time in seconds */ nxtDel = (SPFLOAT) lp->seedVal * reverbParams[n][1] / 32768.0; /* next delay time in seconds */ nxtDel = reverbParams[n][0] + (nxtDel * (SPFLOAT) p->iPitchMod); /* calculate phase increment per sample */ phs_incVal = (prvDel - nxtDel) / (SPFLOAT) lp->randLine_cnt; phs_incVal = phs_incVal * p->sampleRate + 1.0; lp->readPosFrac_inc = (int) (phs_incVal * DELAYPOS_SCALE + 0.5);}static int init_delay_line(sp_revsc *p, sp_revsc_dl *lp, int n){ SPFLOAT readPos; /* int i; */ /* calculate length of delay line */ lp->bufferSize = delay_line_max_samples(p->sampleRate, 1, n); lp->dummy = 0; lp->writePos = 0; /* set random seed */ lp->seedVal = (int) (reverbParams[n][3] + 0.5); /* set initial delay time */ readPos = (SPFLOAT) lp->seedVal * reverbParams[n][1] / 32768; readPos = reverbParams[n][0] + (readPos * (SPFLOAT) p->iPitchMod); readPos = (SPFLOAT) lp->bufferSize - (readPos * p->sampleRate); lp->readPos = (int) readPos; readPos = (readPos - (SPFLOAT) lp->readPos) * (SPFLOAT) DELAYPOS_SCALE; lp->readPosFrac = (int) (readPos + 0.5); /* initialise first random line segment */ next_random_lineseg(p, lp, n); /* clear delay line to zero */ lp->filterState = 0.0; memset(lp->buf, 0, sizeof(SPFLOAT) * lp->bufferSize); return SP_OK;}int sp_revsc_compute(sp_data *sp, sp_revsc *p, SPFLOAT *in1, SPFLOAT *in2, SPFLOAT *out1, SPFLOAT *out2){ SPFLOAT ainL, ainR, aoutL, aoutR; SPFLOAT vm1, v0, v1, v2, am1, a0, a1, a2, frac; sp_revsc_dl *lp; int readPos; uint32_t n; int bufferSize; /* Local copy */ SPFLOAT dampFact = p->dampFact; if (p->initDone <= 0) return SP_NOT_OK; /* calculate tone filter coefficient if frequency changed */ if (p->lpfreq != p->prv_LPFreq) { p->prv_LPFreq = p->lpfreq; dampFact = 2.0 - cos(p->prv_LPFreq * (2 * M_PI) / p->sampleRate); dampFact = p->dampFact = dampFact - sqrt(dampFact * dampFact - 1.0); } /* calculate "resultant junction pressure" and mix to input signals */ ainL = aoutL = aoutR = 0.0; for (n = 0; n < 8; n++) { ainL += p->delayLines[n].filterState; } ainL *= jpScale; ainR = ainL + *in2; ainL = ainL + *in1; /* loop through all delay lines */ for (n = 0; n < 8; n++) { lp = &p->delayLines[n]; bufferSize = lp->bufferSize; /* send input signal and feedback to delay line */ lp->buf[lp->writePos] = (SPFLOAT) ((n & 1 ? ainR : ainL) - lp->filterState); if (++lp->writePos >= bufferSize) { lp->writePos -= bufferSize; } /* read from delay line with cubic interpolation */ if (lp->readPosFrac >= DELAYPOS_SCALE) { lp->readPos += (lp->readPosFrac >> DELAYPOS_SHIFT); lp->readPosFrac &= DELAYPOS_MASK; } if (lp->readPos >= bufferSize) lp->readPos -= bufferSize; readPos = lp->readPos; frac = (SPFLOAT) lp->readPosFrac * (1.0 / (SPFLOAT) DELAYPOS_SCALE); /* calculate interpolation coefficients */ a2 = frac * frac; a2 -= 1.0; a2 *= (1.0 / 6.0); a1 = frac; a1 += 1.0; a1 *= 0.5; am1 = a1 - 1.0; a0 = 3.0 * a2; a1 -= a0; am1 -= a2; a0 -= frac; /* read four samples for interpolation */ if (readPos > 0 && readPos < (bufferSize - 2)) { vm1 = (SPFLOAT) (lp->buf[readPos - 1]); v0 = (SPFLOAT) (lp->buf[readPos]); v1 = (SPFLOAT) (lp->buf[readPos + 1]); v2 = (SPFLOAT) (lp->buf[readPos + 2]); } else { /* at buffer wrap-around, need to check index */ if (--readPos < 0) readPos += bufferSize; vm1 = (SPFLOAT) lp->buf[readPos]; if (++readPos >= bufferSize) readPos -= bufferSize; v0 = (SPFLOAT) lp->buf[readPos]; if (++readPos >= bufferSize) readPos -= bufferSize; v1 = (SPFLOAT) lp->buf[readPos]; if (++readPos >= bufferSize) readPos -= bufferSize; v2 = (SPFLOAT) lp->buf[readPos]; } v0 = (am1 * vm1 + a0 * v0 + a1 * v1 + a2 * v2) * frac + v0; /* update buffer read position */ lp->readPosFrac += lp->readPosFrac_inc; /* apply feedback gain and lowpass filter */ v0 *= (SPFLOAT) p->feedback; v0 = (lp->filterState - v0) * dampFact + v0; lp->filterState = v0; /* mix to output */ if (n & 1) { aoutR += v0; }else{ aoutL += v0; } /* start next random line segment if current one has reached endpoint */ if (--(lp->randLine_cnt) <= 0) { next_random_lineseg(p, lp, n); } } /* someday, use aoutR for multimono out */ *out1 = aoutL * outputGain; *out2 = aoutR * outputGain; return SP_OK;}vendor/soundpipe/modules/saturator.cadded
#include <stdlib.h>#include <math.h>#include "soundpipe.h"#ifndef M_PI#define M_PI 3.14159265358979323846#endifstatic void bilinear_transform(SPFLOAT acoefs[], SPFLOAT dcoefs[], SPFLOAT fs){ SPFLOAT b0, b1, b2, a0, a1, a2; SPFLOAT bz0, bz1, bz2, az0, az1, az2; b0 = acoefs[0]; b1 = acoefs[1]; b2 = acoefs[2]; a0 = acoefs[3]; a1 = acoefs[4]; a2 = acoefs[5]; bz0 = 1.0; bz1 = 0.0; bz2 = 0.0; az0 = 1.0; az1 = 0.0; az2 = 0.0; az0 = a2*4*fs*fs + a1*2*fs + a0; bz2 = (b2*4*fs*fs - b1*2*fs + b0) / az0; bz1 = (-b2*8*fs*fs + 2*b0) / az0; bz0 = (b2*4*fs*fs+ b1*2*fs + b0) / az0; az2 = (a2*4*fs*fs - a1*2*fs + a0) / az0; az1 = (-a2*8*fs*fs + 2*a0) / az0; dcoefs[0] = bz0; dcoefs[1] = bz1; dcoefs[2] = bz2; dcoefs[3] = az1; dcoefs[4] = az2;}int sp_saturator_create(sp_saturator **p){ *p = malloc(sizeof(sp_saturator)); return SP_OK;}int sp_saturator_destroy(sp_saturator **p){ free(*p); return SP_OK;}int sp_saturator_init(sp_data *sp, sp_saturator *p){ int i, j; const SPFLOAT aacoefs[6][7] = { {2.60687e-05, 2.98697e-05, 2.60687e-05, -1.31885, 0.437162, 0.0, 0.0}, {1, -0.800256, 1, -1.38301, 0.496576, 0.0, 0.0}, {1, -1.42083, 1, -1.48787, 0.594413, 0.0, 0.0}, {1, -1.6374, 1, -1.60688, 0.707142, 0.0, 0.0}, {1, -1.7261, 1, -1.7253, 0.822156, 0.0, 0.0}, {1, -1.75999, 1, -1.84111, 0.938811, 0.0, 0.0} }; SPFLOAT wc_dc = 5*2*M_PI; SPFLOAT scoeffs[6] = { 0, 1, 0, wc_dc, 1, 0 }; SPFLOAT zcoeffs[5]; p->drive = 1; p->dcoffset = 0; for(i = 0; i < 6; i++){ for(j = 0; j < 7; j++){ p->aa[i][j] = aacoefs[i][j]; p->ai[i][j] = aacoefs[i][j]; } } bilinear_transform(scoeffs, zcoeffs, sp->sr*8); for(i = 0; i < 2; i++){ for(j = 0; j < 5; j++) p->dcblocker[i][j] = zcoeffs[j]; p->dcblocker[i][5] = 0.0; p->dcblocker[i][6] = 0.0; } return SP_OK;}static int quad_compute(SPFLOAT p[7], SPFLOAT *input, SPFLOAT* output){ SPFLOAT in = *input; *output = p[5] + in * p[0]; p[5] = p[6] + in * p[1] - *output*p[3]; p[6] = in * p[2] - *output*p[4]; return SP_OK;}int sp_saturator_compute(sp_data *sp, sp_saturator *p, SPFLOAT *in, SPFLOAT *out){ int i, j; SPFLOAT fsignal, usignal, dsignal; fsignal = p->drive * *in; for(i = 0; i < 8; i++){ usignal = (i == 0) ? 8 *fsignal : 0.0; for(j = 0; j < 6; j++) quad_compute(p->ai[j], &usignal, &usignal); dsignal = (usignal + p->dcoffset) / (1.0 + fabs(usignal + p->dcoffset)); quad_compute(p->dcblocker[0], &dsignal, &dsignal); quad_compute(p->dcblocker[1], &dsignal, &dsignal); for(j = 0; j < 6; j++) quad_compute(p->aa[j], &dsignal, out); } return SP_OK;}vendor/soundpipe/modules/scale.cadded
#include <stdlib.h>#include "soundpipe.h"int sp_scale_create(sp_scale **p){ *p = malloc(sizeof(sp_scale)); return SP_OK;}int sp_scale_destroy(sp_scale **p){ free(*p); return SP_OK;}int sp_scale_init(sp_data *sp, sp_scale *p){ p->min = -1; p->max = 1; return SP_OK;}int sp_scale_compute(sp_data *sp, sp_scale *p, SPFLOAT *in, SPFLOAT *out){ *out = *in * (p->max - p->min) + p->min; return SP_OK;}vendor/soundpipe/modules/tadsr.cadded
/* * TADSR * * This module uses modified code from Perry Cook's ADSR STK module. * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"enum{ ATTACK, DECAY, SUSTAIN, RELEASE, CLEAR, KEY_ON, KEY_OFF };static void make_Envelope(sp_tadsr *e){ e->target = 0.0; e->value = 0.0; e->rate = 0.001; e->state = 1;}static void make_ADSR(sp_tadsr *a){ make_Envelope(a); a->target = 0.0; a->value = 0.0; a->attackRate = 0.001; a->decayRate = 0.001; a->sustainLevel = 0.0; a->releaseRate = 0.01; a->state = CLEAR;}static void ADSR_keyOn(sp_tadsr *a){ a->target = 1.0; a->rate = a->attackRate; a->state = ATTACK;}static void ADSR_keyOff(sp_tadsr *a){ a->target = 0.0; a->rate = a->releaseRate; a->state = RELEASE;}static void ADSR_setSustainLevel(sp_data *sp, sp_tadsr *a, SPFLOAT aLevel){ a->sustainLevel = aLevel;}static void ADSR_setAttackTime(sp_data *sp, sp_tadsr *a, SPFLOAT aTime){ a->attackRate = 1.0 / (aTime * sp->sr);}static void ADSR_setDecayTime(sp_data *sp, sp_tadsr *a, SPFLOAT aTime){ a->decayRate = 1.0 / (aTime * sp->sr);}static void ADSR_setReleaseTime(sp_data *sp, sp_tadsr *a, SPFLOAT aTime){ a->releaseRate = 1.0 / (aTime * sp->sr);}static void ADSR_setAllTimes(sp_data *sp, sp_tadsr *a, SPFLOAT attTime, SPFLOAT decTime, SPFLOAT susLevel, SPFLOAT relTime){ ADSR_setAttackTime(sp, a, attTime); ADSR_setDecayTime(sp, a, decTime); ADSR_setSustainLevel(sp, a, susLevel); ADSR_setReleaseTime(sp, a, relTime);}static SPFLOAT ADSR_tick(sp_tadsr *a){ SPFLOAT out = 0; if (a->state == ATTACK) { a->value += a->rate; if (a->value >= a->target) { a->value = a->target; a->rate = a->decayRate; a->target = a->sustainLevel; a->state = DECAY; } out = a->value; } else if (a->state == DECAY) { a->value -= a->decayRate; out = a->value; if (a->value <= a->sustainLevel) { a->value = a->sustainLevel; out = a->sustainLevel; a->rate = 0.0; a->state = SUSTAIN; } } else if (a->state == RELEASE) { a->value -= a->releaseRate; if (a->value <= 0.0) { a->value = 0.0; a->state = CLEAR; } out = a->value; } else if (a->state == SUSTAIN) { out = a->sustainLevel; } return out;}int sp_tadsr_create(sp_tadsr **p){ *p = malloc(sizeof(sp_tadsr)); return SP_OK;}int sp_tadsr_destroy(sp_tadsr **p){ free(*p); return SP_OK;}int sp_tadsr_init(sp_data *sp, sp_tadsr *p){ make_ADSR(p); p->atk = 0.5; p->dec = 0.5; p->sus = 0.0; p->rel = 0.5; p->mode = KEY_OFF; return SP_OK;}int sp_tadsr_compute(sp_data *sp, sp_tadsr *p, SPFLOAT *trig, SPFLOAT *out){ if(*trig != 0) { if(*trig == 2) { ADSR_keyOff(p); p->mode = KEY_OFF; }else if(p->mode == KEY_OFF) { ADSR_setAllTimes(sp, p, p->atk, p->dec, p->sus, p->rel); ADSR_keyOn(p); p->mode = KEY_ON; } else { ADSR_keyOff(p); p->mode = KEY_OFF; } } *out = ADSR_tick(p); return SP_OK;}vendor/soundpipe/modules/tenv.cadded
#include <stdlib.h>#include "soundpipe.h"int sp_tenv_create(sp_tenv **p){ *p = malloc(sizeof(sp_tenv)); return SP_OK;}int sp_tenv_destroy(sp_tenv **p){ free(*p); return SP_OK;}static void sp_tenv_reinit(void *ud){ sp_tenv *env = ud; env->pos = 0; env->atk_end = env->sr * env->atk; env->rel_start = env->sr * (env->atk + env->hold); env->atk_slp = 1.0 / env->atk_end; env->rel_slp = -1.0 / (env->sr * env->rel); env->totaldur = env->sr * (env->atk + env->hold + env->rel);}static void sp_tenv_comp(void *ud, SPFLOAT *out){ sp_tenv *env = ud; SPFLOAT sig = 0; uint32_t pos = env->pos; *out = 0.0; if (pos < env->atk_end) { sig = env->last + env->atk_slp; } else if (pos < env->rel_start) { sig = 1.0; } else if (pos < env->totaldur) { sig = env->last + env->rel_slp; } else{ sig = 0.0; } sig = (sig > 1.0) ? 1.0 : sig; sig = (sig < 0.0) ? 0.0 : sig; /* Internal input signal mode */ if (env->sigmode) { *out = env->input * sig; } else { *out = sig; } env->pos++; env->last = sig;}int sp_tenv_init(sp_data *sp, sp_tenv *p){ p->pos = 0; p->last = 0; p->atk = 0.1; p->hold = 0.3; p->rel = 0.2; p->sigmode = 0; p->input = 0; p->sr = sp->sr; p->atk_end = p->sr * p->atk; p->rel_start = p->sr * (p->atk + p->hold); p->atk_slp = 1.0 / p->atk_end; p->rel_slp = -1.0 / (p->sr * p->rel); p->totaldur = p->sr * (p->atk + p->hold + p->rel); p->started = 0; return SP_OK;}int sp_tenv_compute(sp_data *sp, sp_tenv *p, SPFLOAT *in, SPFLOAT *out){ if (*in) { sp_tenv_reinit(p); p->started = 1; } if (p->started) sp_tenv_comp(p, out); else *out = 0; return SP_OK;}vendor/soundpipe/modules/tgate.cadded
#include <stdlib.h>#include "soundpipe.h"int sp_tgate_create(sp_tgate **p){ *p = malloc(sizeof(sp_tgate)); return SP_OK;}int sp_tgate_destroy(sp_tgate **p){ free(*p); return SP_OK;}int sp_tgate_init(sp_data *sp, sp_tgate *p){ p->time = 0; p->timer = 0; return SP_OK;}int sp_tgate_compute(sp_data *sp, sp_tgate *p, SPFLOAT *in, SPFLOAT *out){ *out = 0; if(*in != 0) { p->timer = p->time * sp->sr; } if(p->timer != 0) { *out = 1; p->timer--; } return SP_OK;}vendor/soundpipe/modules/tone.cadded
/* * Tone * * This code has been extracted from the Csound opcode "tone". * It has been modified to work as a Soundpipe module. * * Original Author(s): Barry Vercoe, John FFitch, Gabriel Maldonado * Year: 1991 * Location: OOps/ugens5.c * */#include <stdlib.h>#include <math.h>#include <stdint.h>#ifndef M_PI#define M_PI 3.14159265358979323846#endif#include "soundpipe.h"int sp_tone_create(sp_tone **t){ *t = malloc(sizeof(sp_tone)); return SP_OK;}int sp_tone_destroy(sp_tone **t){ free(*t); return SP_OK;}int sp_tone_init(sp_data *sp, sp_tone *p){ p->hp = 1000; SPFLOAT b; p->tpidsr = (2.0 * M_PI) / sp->sr * 1.0; p->prvhp = (SPFLOAT)p->hp; b = 2.0 - cos((SPFLOAT)(p->prvhp * p->tpidsr)); p->c2 = b - sqrt(b * b - 1.0); p->c1 = 1.0 - p->c2; p->yt1 = 0.0; return SP_OK;}int sp_tone_compute(sp_data *sp, sp_tone *p, SPFLOAT *in, SPFLOAT *out){ SPFLOAT c1 = p->c1, c2 = p->c2; SPFLOAT yt1 = p->yt1; if (p->hp != p->prvhp) { SPFLOAT b; p->prvhp = p->hp; b = 2.0 - cos((p->prvhp * p->tpidsr)); p->c2 = c2 = b - sqrt(b * b - 1.0); p->c1 = c1 = 1.0 - c2; } yt1 = c1 * (*in) + c2 * yt1; *out = yt1; p->yt1 = yt1; return SP_OK;}vendor/soundpipe/modules/vdelay.cadded
/* * Del * * This code has been extracted from the Csound opcode "vdelay3". * It has been modified to work as a Soundpipe module. * * Original Author(s): Paris Smaradgis, Istvan Varga * Year: 1994 * Location: OOps/vdelay.c * */#include <stdlib.h>#include "soundpipe.h"int sp_vdelay_create(sp_vdelay **p){ *p = malloc(sizeof(sp_vdelay)); return SP_OK;}int sp_vdelay_destroy(sp_vdelay **p){ sp_vdelay *pp = *p; sp_auxdata_free(&pp->buf); free(*p); return SP_OK;}int sp_vdelay_init(sp_data *sp, sp_vdelay *p, SPFLOAT maxdel){ uint32_t n = (int32_t)(maxdel * sp->sr)+1; p->sr = sp->sr; p->del = maxdel * 0.5; p->maxdel = maxdel; sp_auxdata_alloc(&p->buf, n * sizeof(SPFLOAT)); p->left = 0; p->feedback = 0; p->prev = 0; return SP_OK;}int sp_vdelay_compute(sp_data *sp, sp_vdelay *p, SPFLOAT *in, SPFLOAT *out){ int32_t maxd, indx; *out = p->sr; SPFLOAT del = p->del; SPFLOAT b0, b1, b2, b3; int32_t v0, v1, v2, v3; SPFLOAT fv1; indx = p->left; SPFLOAT *buf = (SPFLOAT *)p->buf.ptr; buf[indx] = *in + p->prev*p->feedback; fv1 = del * (-1.0 * sp->sr); v1 = (int32_t)fv1; fv1 -= (SPFLOAT) v1; v1 += (int32_t)indx; maxd = (uint32_t) (p->maxdel * p->sr); /* Make sure we're inside the buffer */ if ((v1 < 0) || (fv1 < 0.0)) { fv1++; v1--; while (v1 < 0) { v1 += (int32_t)maxd; } } else { while (v1 >= (int32_t)maxd) { v1 -= (int32_t)maxd; } } /* Find next sample for interpolation */ v2 = (v1 == (int32_t)(maxd - 1UL) ? 0L : v1 + 1L); if (maxd<4) { b1 = buf[v1]; b2 = buf[v2]; *out = b1 + fv1 * (b2 - b1); } else { v0 = (v1==0 ? maxd-1 : v1-1); v3 = (v2==(int32_t)maxd-1 ? 0 : v2+1); { SPFLOAT w, x, y, z; z = fv1 * fv1; z--; z *= 0.1666666667; y = fv1; y++; w = (y *= 0.5); w--; x = 3.0 * z; y -= x; w -= z; x -= fv1; b0 = buf[v0]; b1 = buf[v1]; b2 = buf[v2]; b3 = buf[v3]; *out = (w*b0 + x*b1 + y*b2 + z*b3) * fv1 + b1; } } if (++indx == maxd) indx = 0; p->left = indx; p->prev = *out; return SP_OK;}int sp_vdelay_reset(sp_data *sp, sp_vdelay *p){ SPFLOAT *buf; uint32_t n; int32_t maxd; buf = (SPFLOAT *)p->buf.ptr; p->left = 0; maxd = (uint32_t) (p->maxdel * p->sr); for(n = 0; n < maxd; n++) buf[n] = 0; return SP_OK;}vendor/soundpipe/modules/wavout.cadded
#include <stdlib.h>#include "soundpipe.h"#include "dr_wav.h"#define WAVOUT_BUFSIZE 1024struct sp_wavout { drwav *wav; drwav_data_format format; SPFLOAT buf[WAVOUT_BUFSIZE]; int count;};int sp_wavout_create(sp_wavout **p){ *p = malloc(sizeof(sp_wavout)); return SP_OK;}int sp_wavout_destroy(sp_wavout **p){ /* write any remaining samples */ if((*p)->count != 0) { drwav_write((*p)->wav, (*p)->count, (*p)->buf); } drwav_close((*p)->wav); free(*p); return SP_OK;}int sp_wavout_init(sp_data *sp, sp_wavout *p, const char *filename){ p->count = 0; p->format.container = drwav_container_riff; p->format.format = DR_WAVE_FORMAT_IEEE_FLOAT; p->format.channels = 1; p->format.sampleRate = sp->sr; p->format.bitsPerSample = 32; p->wav = drwav_open_file_write(filename, &p->format); return SP_OK;}int sp_wavout_compute(sp_data *sp, sp_wavout *p, SPFLOAT *in, SPFLOAT *out){ *out = *in; if(p->count == WAVOUT_BUFSIZE) { drwav_write(p->wav, WAVOUT_BUFSIZE, p->buf); p->count = 0; } p->buf[p->count] = *in; p->count++; return SP_OK;}vendor/soundpipe/modules/zitarev.cadded
/* * Zitarev * * This code has been generated FAUST. * It uses the zitarev module included in the FAUST * standard library (FAUST port by Julius Smith). * It has been modified to work as a Soundpipe module. * * Original Author: Fons Adriaensen * */#include <stdlib.h>#include <math.h>#include "soundpipe.h"#include "CUI.h"#define max(a,b) ((a < b) ? b : a)#define min(a,b) ((a < b) ? a : b)#ifndef FAUSTFLOAT#define FAUSTFLOAT float#endiffloat powf(float dummy0, float dummy1);float sqrtf(float dummy0);float cosf(float dummy0);float floorf(float dummy0);float expf(float dummy0);static float faustpower2_f(float value) { return (value * value);}float tanf(float dummy0);typedef struct { float fVec1[32768]; float fVec4[32768]; float fVec8[32768]; float fVec6[16384]; float fVec10[16384]; float fVec12[16384]; float fVec14[16384]; float fVec16[16384]; float fVec0[8192]; float fVec2[8192]; float fVec5[4096]; float fVec7[4096]; float fVec9[4096]; float fVec13[4096]; float fVec15[4096]; float fVec3[2048]; float fVec11[2048]; float fVec17[2048]; float fRec4[3]; float fRec5[3]; float fRec6[3]; float fRec7[3]; float fRec8[3]; float fRec9[3]; float fRec10[3]; float fRec11[3]; float fRec3[3]; float fRec2[3]; float fRec45[3]; float fRec44[3]; float fRec0[2]; float fRec1[2]; float fRec15[2]; float fRec14[2]; float fRec12[2]; float fRec19[2]; float fRec18[2]; float fRec16[2]; float fRec23[2]; float fRec22[2]; float fRec20[2]; float fRec27[2]; float fRec26[2]; float fRec24[2]; float fRec31[2]; float fRec30[2]; float fRec28[2]; float fRec35[2]; float fRec34[2]; float fRec32[2]; float fRec39[2]; float fRec38[2]; float fRec36[2]; float fRec43[2]; float fRec42[2]; float fRec40[2]; FAUSTFLOAT fHslider0; FAUSTFLOAT fHslider1; int IOTA; int fSamplingFreq; int iConst0; float fConst1; FAUSTFLOAT fHslider2; FAUSTFLOAT fHslider3; FAUSTFLOAT fHslider4; FAUSTFLOAT fHslider5; float fConst2; float fConst3; FAUSTFLOAT fHslider6; float fConst4; FAUSTFLOAT fHslider7; FAUSTFLOAT fHslider8; float fConst5; FAUSTFLOAT fHslider9; float fConst6; int iConst7; float fConst8; FAUSTFLOAT fHslider10; int iConst9; float fConst10; float fConst11; float fConst12; int iConst13; int iConst14; float fConst15; float fConst16; float fConst17; int iConst18; int iConst19; float fConst20; float fConst21; float fConst22; int iConst23; int iConst24; float fConst25; float fConst26; float fConst27; int iConst28; int iConst29; float fConst30; float fConst31; float fConst32; int iConst33; int iConst34; float fConst35; float fConst36; float fConst37; int iConst38; int iConst39; float fConst40; float fConst41; float fConst42; int iConst43; int iConst44;} zitarev;static zitarev* newzitarev() { zitarev* dsp = (zitarev*)malloc(sizeof(zitarev)); return dsp;}static void deletezitarev(zitarev* dsp) { free(dsp);}static void instanceInitzitarev(zitarev* dsp, int samplingFreq) { dsp->fSamplingFreq = samplingFreq; dsp->fHslider0 = (FAUSTFLOAT)-20.; /* C99 loop */ { int i0; for (i0 = 0; (i0 < 2); i0 = (i0 + 1)) { dsp->fRec0[i0] = 0.f; } } dsp->fHslider1 = (FAUSTFLOAT)1.; /* C99 loop */ { int i1; for (i1 = 0; (i1 < 2); i1 = (i1 + 1)) { dsp->fRec1[i1] = 0.f; } } dsp->IOTA = 0; /* C99 loop */ { int i2; for (i2 = 0; (i2 < 8192); i2 = (i2 + 1)) { dsp->fVec0[i2] = 0.f; } } dsp->iConst0 = min(192000, max(1, dsp->fSamplingFreq)); dsp->fConst1 = (6.28319f / (float)dsp->iConst0); dsp->fHslider2 = (FAUSTFLOAT)1500.; dsp->fHslider3 = (FAUSTFLOAT)0.; dsp->fHslider4 = (FAUSTFLOAT)315.; dsp->fHslider5 = (FAUSTFLOAT)0.; dsp->fConst2 = floorf((0.5f + (0.219991f * (float)dsp->iConst0))); dsp->fConst3 = ((0.f - (6.90776f * dsp->fConst2)) / (float)dsp->iConst0); dsp->fHslider6 = (FAUSTFLOAT)2.; dsp->fConst4 = (6.28319f / (float)dsp->iConst0); dsp->fHslider7 = (FAUSTFLOAT)6000.; dsp->fHslider8 = (FAUSTFLOAT)3.; dsp->fConst5 = (3.14159f / (float)dsp->iConst0); dsp->fHslider9 = (FAUSTFLOAT)200.; /* C99 loop */ { int i3; for (i3 = 0; (i3 < 2); i3 = (i3 + 1)) { dsp->fRec15[i3] = 0.f; } } /* C99 loop */ { int i4; for (i4 = 0; (i4 < 2); i4 = (i4 + 1)) { dsp->fRec14[i4] = 0.f; } } /* C99 loop */ { int i5; for (i5 = 0; (i5 < 32768); i5 = (i5 + 1)) { dsp->fVec1[i5] = 0.f; } } dsp->fConst6 = floorf((0.5f + (0.019123f * (float)dsp->iConst0))); dsp->iConst7 = (int)((int)(dsp->fConst2 - dsp->fConst6) & 32767); /* C99 loop */ { int i6; for (i6 = 0; (i6 < 8192); i6 = (i6 + 1)) { dsp->fVec2[i6] = 0.f; } } dsp->fConst8 = (0.001f * (float)dsp->iConst0); dsp->fHslider10 = (FAUSTFLOAT)60.; /* C99 loop */ { int i7; for (i7 = 0; (i7 < 2048); i7 = (i7 + 1)) { dsp->fVec3[i7] = 0.f; } } dsp->iConst9 = (int)((int)(dsp->fConst6 - 1.f) & 2047); /* C99 loop */ { int i8; for (i8 = 0; (i8 < 2); i8 = (i8 + 1)) { dsp->fRec12[i8] = 0.f; } } dsp->fConst10 = floorf((0.5f + (0.256891f * (float)dsp->iConst0))); dsp->fConst11 = ((0.f - (6.90776f * dsp->fConst10)) / (float)dsp->iConst0); /* C99 loop */ { int i9; for (i9 = 0; (i9 < 2); i9 = (i9 + 1)) { dsp->fRec19[i9] = 0.f; } } /* C99 loop */ { int i10; for (i10 = 0; (i10 < 2); i10 = (i10 + 1)) { dsp->fRec18[i10] = 0.f; } } /* C99 loop */ { int i11; for (i11 = 0; (i11 < 32768); i11 = (i11 + 1)) { dsp->fVec4[i11] = 0.f; } } dsp->fConst12 = floorf((0.5f + (0.027333f * (float)dsp->iConst0))); dsp->iConst13 = (int)((int)(dsp->fConst10 - dsp->fConst12) & 32767); /* C99 loop */ { int i12; for (i12 = 0; (i12 < 4096); i12 = (i12 + 1)) { dsp->fVec5[i12] = 0.f; } } dsp->iConst14 = (int)((int)(dsp->fConst12 - 1.f) & 4095); /* C99 loop */ { int i13; for (i13 = 0; (i13 < 2); i13 = (i13 + 1)) { dsp->fRec16[i13] = 0.f; } } dsp->fConst15 = floorf((0.5f + (0.192303f * (float)dsp->iConst0))); dsp->fConst16 = ((0.f - (6.90776f * dsp->fConst15)) / (float)dsp->iConst0); /* C99 loop */ { int i14; for (i14 = 0; (i14 < 2); i14 = (i14 + 1)) { dsp->fRec23[i14] = 0.f; } } /* C99 loop */ { int i15; for (i15 = 0; (i15 < 2); i15 = (i15 + 1)) { dsp->fRec22[i15] = 0.f; } } /* C99 loop */ { int i16; for (i16 = 0; (i16 < 16384); i16 = (i16 + 1)) { dsp->fVec6[i16] = 0.f; } } dsp->fConst17 = floorf((0.5f + (0.029291f * (float)dsp->iConst0))); dsp->iConst18 = (int)((int)(dsp->fConst15 - dsp->fConst17) & 16383); /* C99 loop */ { int i17; for (i17 = 0; (i17 < 4096); i17 = (i17 + 1)) { dsp->fVec7[i17] = 0.f; } } dsp->iConst19 = (int)((int)(dsp->fConst17 - 1.f) & 4095); /* C99 loop */ { int i18; for (i18 = 0; (i18 < 2); i18 = (i18 + 1)) { dsp->fRec20[i18] = 0.f; } } dsp->fConst20 = floorf((0.5f + (0.210389f * (float)dsp->iConst0))); dsp->fConst21 = ((0.f - (6.90776f * dsp->fConst20)) / (float)dsp->iConst0); /* C99 loop */ { int i19; for (i19 = 0; (i19 < 2); i19 = (i19 + 1)) { dsp->fRec27[i19] = 0.f; } } /* C99 loop */ { int i20; for (i20 = 0; (i20 < 2); i20 = (i20 + 1)) { dsp->fRec26[i20] = 0.f; } } /* C99 loop */ { int i21; for (i21 = 0; (i21 < 32768); i21 = (i21 + 1)) { dsp->fVec8[i21] = 0.f; } } dsp->fConst22 = floorf((0.5f + (0.024421f * (float)dsp->iConst0))); dsp->iConst23 = (int)((int)(dsp->fConst20 - dsp->fConst22) & 32767); /* C99 loop */ { int i22; for (i22 = 0; (i22 < 4096); i22 = (i22 + 1)) { dsp->fVec9[i22] = 0.f; } } dsp->iConst24 = (int)((int)(dsp->fConst22 - 1.f) & 4095); /* C99 loop */ { int i23; for (i23 = 0; (i23 < 2); i23 = (i23 + 1)) { dsp->fRec24[i23] = 0.f; } } dsp->fConst25 = floorf((0.5f + (0.125f * (float)dsp->iConst0))); dsp->fConst26 = ((0.f - (6.90776f * dsp->fConst25)) / (float)dsp->iConst0); /* C99 loop */ { int i24; for (i24 = 0; (i24 < 2); i24 = (i24 + 1)) { dsp->fRec31[i24] = 0.f; } } /* C99 loop */ { int i25; for (i25 = 0; (i25 < 2); i25 = (i25 + 1)) { dsp->fRec30[i25] = 0.f; } } /* C99 loop */ { int i26; for (i26 = 0; (i26 < 16384); i26 = (i26 + 1)) { dsp->fVec10[i26] = 0.f; } } dsp->fConst27 = floorf((0.5f + (0.013458f * (float)dsp->iConst0))); dsp->iConst28 = (int)((int)(dsp->fConst25 - dsp->fConst27) & 16383); /* C99 loop */ { int i27; for (i27 = 0; (i27 < 2048); i27 = (i27 + 1)) { dsp->fVec11[i27] = 0.f; } } dsp->iConst29 = (int)((int)(dsp->fConst27 - 1.f) & 2047); /* C99 loop */ { int i28; for (i28 = 0; (i28 < 2); i28 = (i28 + 1)) { dsp->fRec28[i28] = 0.f; } } dsp->fConst30 = floorf((0.5f + (0.127837f * (float)dsp->iConst0))); dsp->fConst31 = ((0.f - (6.90776f * dsp->fConst30)) / (float)dsp->iConst0); /* C99 loop */ { int i29; for (i29 = 0; (i29 < 2); i29 = (i29 + 1)) { dsp->fRec35[i29] = 0.f; } } /* C99 loop */ { int i30; for (i30 = 0; (i30 < 2); i30 = (i30 + 1)) { dsp->fRec34[i30] = 0.f; } } /* C99 loop */ { int i31; for (i31 = 0; (i31 < 16384); i31 = (i31 + 1)) { dsp->fVec12[i31] = 0.f; } } dsp->fConst32 = floorf((0.5f + (0.031604f * (float)dsp->iConst0)));Showing the first 500 of 1063 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.