aboutsummaryrefslogtreecommitdiff
path: root/site/udo/bussing_quad.udo
blob: b8570122810d0f10044ced98751be45d51afcfe4 (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
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