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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
#ifndef UDO_BUSSINGQUAD
#define UDO_BUSSINGQUAD ##
/*
Quad bus handling
This file is part of the SONICS UDO collection by Richard Knight 2021, 2023, 2025
License: GPL-2.0-or-later
http://1bpm.net
*/
/*
Get the quad left/right/front/rear names for a singular bus name
SnameLF, SnameRF, SnameLR, SnameRR qbus_name Sbus
SnameLF left front bus identifier
SnameRF right front bus identifier
SnameLR left rear bus identifier
SnameRR right rear bus identifier
Sbus bus name
*/
opcode qbus_name, SSSS, S
Sbus xin
xout sprintf("%sLF", Sbus), sprintf("%sRF", Sbus), sprintf("%sLR", Sbus), sprintf("%sRR", Sbus)
endop
/*
Read from a quad bus, but do not clear it
aLF, aRF, aLR, aRR qbus_tap Sbus
aLF left front channel
aRF right front channel
aLR left rear channel
aRR right rear channel
Sbus bus name
*/
opcode qbus_tap, aaaa, S
Sbus xin
SbusLF, SbusRF, SbusLR, SbusRR qbus_name Sbus
aLF chnget SbusLF
aRF chnget SbusRF
aLR chnget SbusLR
aRR chnget SbusRR
xout aLF, aRF, aLR, aRR
endop
/*
Read from a quad bus, and then clear the bus
aLF, aRF, aLR, aRR qbus_read Sbus
aLF left front channel
aRF right front channel
aLR left rear channel
aRR right rear channel
Sbus bus name
*/
opcode qbus_read, aaaa, S
Sbus xin
SbusLF, SbusRF, SbusLR, SbusRR qbus_name Sbus
aLF chnget SbusLF
aRF chnget SbusRF
aLR chnget SbusLR
aRR chnget SbusRR
chnclear SbusLF
chnclear SbusRF
chnclear SbusLR
chnclear SbusRR
xout aLF, aRF, aLR, aRR
endop
/*
Set to a quad bus
qbus_set Sbus, aLF, aRF, aLR, aRR
Sbus bus name
aLF left front channel
aRF right front channel
aLR left rear channel
aRR right rear channel
*/
opcode qbus_set, 0, Saaaa
Sbus, aLF, aRF, aLR, aRR xin
SbusLF, SbusRF, SbusLR, SbusRR qbus_name Sbus
chnset aLF, SbusLF
chnset aRF, SbusRF
chnset aLR, SbusLR
chnset aRR, SbusRR
endop
/*
Mix to a quad bus
qbus_mix Sbus, aLF, aRF, aLR, aRR
Sbus bus name
aLF left front channel
aRF right front channel
aLR left rear channel
aRR right rear channel
*/
opcode qbus_mix, 0, Saaaa
Sbus, aLF, aRF, aLR, aRR xin
SbusLF, SbusRF, SbusLR, SbusRR qbus_name Sbus
chnmix aLF, SbusLF
chnmix aRF, SbusRF
chnmix aLR, SbusLR
chnmix aRR, SbusRR
endop
/*
Mix to master bus
qbus_masterout aLF, aRF, aLR, aRR
aLF left front channel
aRF right front channel
aLR left rear channel
aRR right rear channel
*/
opcode qbus_masterout, 0, aaaa
aLF, aRF, aLR, aRR xin
chnmix aLF, "mainLF"
chnmix aRF, "mainRF"
chnmix aLR, "mainLR"
chnmix aRR, "mainRR"
endop
/*
Record a bus to a wave file
qbus_record Sbus, Spath
Sbus bus name
Spath path to file to record to
*/
opcode qbus_record, 0, SS
Sbus, Spath xin
aLF, aRF, aLR, aRR qbus_tap Sbus
fout Spath, 14, aLF, aRF, aLR, aRR
endop
; TODO: is this really used?
;gkqmastervolume init 1
/*
Main output: anything mixed to the "main" bus goes to main outputs
instr _qmainmixer
aLF, aRF, aLR, aRR qbus_read "main"
aLF *= gkqmastervolume
aRF *= gkqmastervolume
aLR *= gkqmastervolume
aRR *= gkqmastervolume
outq aLF, aRF, aLR, aRR
endin
alwayson "_qmainmixer"
*/
#end
|