AtlatestRepositorysigil-dsp

sigil-dsp / tree / src / sigil / dsposc.sgl

1;;; (sigil dsp osc) - Oscillators
2;;;
3;;; Wavetable, bandlimited, FM, and phase oscillators.
4;;;
5;;; ```scheme
6;;; (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 sample
10;;; ```
12(define-library (sigil dsp osc)
13 (export
14 make-oscillator
15 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 (begin
28 (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; algorithm
65 ;; 0..7; feedback 0..1 on operator 3; velocity scales the index
66 ;; through (1 - vel-depth + vel-depth * velocity^vel-curve).
67 ;;; Create a four-operator FM voice. `algorithm` is 0..7 (see
68 ;;; fm4-algorithm-name), `feedback` 0..1 self-modulates operator 3,
69 ;;; and velocity scales the index through
70 ;;; (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 a
74 ;;; 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 every
82 ;;; operator's phase and restarts its envelope; index 0 makes each
83 ;;; 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, fm
92 (define (make-oscillator type freq amp . opts)
93 (case type
94 ((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))))))