AtlatestRepositorysigil-dsp
1
;;; (sigil dsp osc) - Oscillators2
;;;3
;;; Wavetable, bandlimited, FM, and phase oscillators.4
;;;5
;;; ```scheme6
;;; (import (sigil dsp core) (sigil dsp osc))7
;;; (dsp-init)8
;;; (define osc (make-oscillator 'sine 440.0 0.5))9
;;; (osc-compute osc) ; => one sample10
;;; ```12
(define-library (sigil dsp osc)13
(export14
make-oscillator15
make-osc make-osc-ft osc-compute osc-set-freq! osc-set-amp!16
make-posc3 posc3-compute posc3-set-freq! posc3-set-amp!17
make-blsaw blsaw-compute blsaw-set-freq! blsaw-set-amp!18
make-blsquare blsquare-compute blsquare-set-freq! blsquare-set-amp!19
make-bltriangle bltriangle-compute bltriangle-set-freq! bltriangle-set-amp!20
make-fosc fosc-compute fosc-set-freq! fosc-set-index! fosc-set-amp!21
make-phasor phasor-compute phasor-set-freq!22
make-ks ks-compute ks-trigger!23
ks-set-freq! ks-set-decay! ks-set-excite-gain!24
make-fm4 fm4-set-op! fm4-set-algorithm! fm4-set-feedback!25
fm4-compute fm4-algorithm-name)27
(begin28
(define-native make-osc)29
(define-native make-osc-ft)30
(define-native (osc-compute osc))31
(define-native (osc-set-freq! osc freq))32
(define-native (osc-set-amp! osc amp))33
(define-native make-posc3)34
(define-native (posc3-compute osc))35
(define-native (posc3-set-freq! osc freq))36
(define-native (posc3-set-amp! osc amp))37
(define-native (make-blsaw freq amp))38
(define-native (blsaw-compute osc))39
(define-native (blsaw-set-freq! osc freq))40
(define-native (blsaw-set-amp! osc amp))41
(define-native make-blsquare)42
(define-native (blsquare-compute osc))43
(define-native (blsquare-set-freq! osc freq))44
(define-native (blsquare-set-amp! osc amp))45
(define-native (make-bltriangle freq amp))46
(define-native (bltriangle-compute osc))47
(define-native (bltriangle-set-freq! osc freq))48
(define-native (bltriangle-set-amp! osc amp))49
(define-native (make-fosc freq car mod indx amp))50
(define-native (fosc-compute osc))51
(define-native (fosc-set-freq! osc freq))52
(define-native (fosc-set-index! osc indx))53
(define-native (fosc-set-amp! osc amp))54
(define-native make-phasor)55
(define-native (phasor-compute phasor))56
(define-native (phasor-set-freq! phasor freq))57
(define-native (make-ks freq decay excite-gain))58
(define-native (ks-compute ks gate))59
(define-native (ks-trigger! ks))60
(define-native (ks-set-freq! ks freq))61
(define-native (ks-set-decay! ks decay))62
(define-native (ks-set-excite-gain! ks gain))64
;; Four-operator FM voice (fm4.h). Operators are 0..3; algorithm65
;; 0..7; feedback 0..1 on operator 3; velocity scales the index66
;; through (1 - vel-depth + vel-depth * velocity^vel-curve).67
;;; Create a four-operator FM voice. `algorithm` is 0..7 (see68
;;; fm4-algorithm-name), `feedback` 0..1 self-modulates operator 3,69
;;; and velocity scales the index through70
;;; (1 - vel-depth + vel-depth * velocity^vel-curve).71
(define-native (make-fm4 algorithm feedback vel-depth vel-curve)72
(: number? number? number? number? -> foreign?))73
;;; Set operator `op` (0..3): frequency ratio, level 0..1 and a74
;;; linear ADSR (attack, decay, release in seconds; sustain 0..1).75
(define-native (fm4-set-op! fm4 op ratio level attack decay sustain release)76
(: foreign? integer? number? number? number? number? number? number? -> any?))77
(define-native (fm4-set-algorithm! fm4 algorithm)78
(: foreign? integer? -> any?))79
(define-native (fm4-set-feedback! fm4 feedback)80
(: foreign? number? -> any?))81
;;; One sample. A rising edge on `gate` (> 0.5) resets every82
;;; operator's phase and restarts its envelope; index 0 makes each83
;;; carrier a pure sine at freq * ratio.84
(define-native (fm4-compute fm4 freq gate index velocity)85
(: foreign? number? number? number? number? -> number?))86
;;; Name of algorithm 0..7, or #f out of range.87
(define-native (fm4-algorithm-name algorithm)88
(: integer? -> (maybe string?)))90
;;; Create an oscillator by type.91
;;; Types: sine, saw, square, triangle, fm92
(define (make-oscillator type freq amp . opts)93
(case type94
((sine) (make-osc freq amp))95
((saw) (make-blsaw freq amp))96
((square) (if (null? opts)97
(make-blsquare freq amp)98
(make-blsquare freq amp (car opts))))99
((triangle) (make-bltriangle freq amp))100
((fm) (if (>= (length opts) 2)101
(make-fosc freq (car opts) (cadr opts)102
(if (>= (length opts) 3) (caddr opts) 1.0)103
amp)104
(error "make-oscillator: fm requires car and mod ratios" opts)))105
(else (error "make-oscillator: unknown type" type))))))