aboutsummaryrefslogtreecommitdiff
path: root/site/udo/synth_instruments.udo
blob: a5ec34c0781308475c36e08f32bdc6e2e7769f16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef UDO_SYNTHINSTRUMENTS
#define UDO_SYNTHINSTRUMENTS ##
/*
	Standard regular wave function tables

	This file is part of the SONICS UDO collection by Richard Knight 2023
		License: GPL-2.0-or-later
		http://1bpm.net
*/

#include "wavetables.udo"

opcode synth_fmbass1, aa, k
	kfreq xin
	k1 linseg 2.1, p3*0.2, 2, p3*0.8, 2
	k2 line 10, p3, 0
	iamp random 500, 800
	kamp linseg iamp*0.001, p3*0.1, 0.5, p3*0.9, 0
	aL foscil 0.8, kfreq, 1, k1, k2, gifnSine
	aR foscil 0.8, kfreq, 1.9, k1, k2, gifnSine
	aL1 pareq aL, 440, 0.4, 0.7 
	aR1 pareq aR, 440, 0.4, 0.7
	xout aL1, aR1
endop 


opcode synth_303, a, kjJ
	kfreq, ifilter, kdistortion xin
	ifilter = (ifilter == -1) ? 90 : ifilter
	kdistortion = (kdistortion == -1) ? 1 : kdistortion
	ifrq1 = 440 * exp(log(2) * (ifilter - 69) / 12)	; filter start freq.
	kffrq port 0, 60/150, ifrq1
	a1 phasor kfreq
	a1 = 1 - 2 * a1
	a1x butterbp a1, kffrq, kfreq
	a1x = a1x * (2 + kffrq / kfreq)
	a1 = a1x + a1 * 0.25 ; 0.5
	a1 butterlp a1, kffrq
	a1 = taninv(a1 * kdistortion)
	keqf limit kffrq * 4, 10, sr * 0.48	; EQ frequency
	a1 pareq a1 * 0.4, keqf, 4.0, 1.0, 2
	xout a1
endop

opcode synth_strings1, a, kJJjj
	kfreq, kvibwidth, kvibrate, inoisdur, ivibdel xin
	kvibwidth = (kvibwidth == -1) ? 0.01 : kvibwidth
	kvibrate = (kvibrate == -1) ? 5.5 : kvibrate
	inoisdur = (inoisdur == -1) ? 0.1 : inoisdur
	ivibdel = (ivibdel == -1) ? 0.25 : ivibdel

	kfm2 = kfreq * 3
	kfm3 = kfreq * 4
	kindex1 = 7.5 / log:k(kfreq)
	kindex2 = 15 / sqrt:k(kfreq)
	kindex3 = 1.25 / sqrt:k(kfreq)

	irise = 0.1
	idec = 0.4

	kvib init 0
	kvbctl linen 1, 0.5, p3 - ivibdel, .1
	krnd randi 0.0075, 2
	kvib oscili kvbctl * kvibwidth + krnd, kvibrate * kvbctl

	ktrans linseg 1, inoisdur, 0, 1, 0
	anoise randi ktrans / 4, 0.2 * kfreq
	attack oscili anoise, 2000

	amod1 oscili kfreq * (kindex1 + ktrans), kfreq
	amod2 oscili kfm2 * (kindex2 + ktrans), kfm2
	amod3 oscili kfm3 * (kindex3 + ktrans), kfm3
	asig oscili 1, (kfreq + amod1 + amod2 + amod3) * (1 + kvib)
	asig linen (asig + attack), irise, p3, idec
	xout asig
endop

#end