#ifndef UDO_BUSSING #define UDO_BUSSING ## /* Bus handling This file is part of the SONICS UDO collection by Richard Knight 2021, 2024 License: GPL-2.0-or-later http://1bpm.net */ #ifdef BUS_MAINMIXER gkmastervolume init 1 #end /* Get the stereo L and R names for a singular bus name SnameL, SnameR bus_name Sbus SnameL left bus identifier SnameR right bus identifier Sbus bus name */ opcode bus_name, SS, S Sbus xin xout sprintf("%sL", Sbus), sprintf("%sR", Sbus) endop /* Read from a stereo bus, but do not clear it aL, aR bus_tap Sbus aL left channel aR right channel Sbus bus name */ opcode bus_tap, aa, S Sbus xin SbusL, SbusR bus_name Sbus aL chnget SbusL aR chnget SbusR xout aL, aR endop /* Read from a mono bus (or left channel of a stereo bus), but do not clear it aout bus_tap Sbus aout output audio Sbus bus name */ opcode bus_tap, a, S Sbus xin SbusL, S_ bus_name Sbus aout chnget SbusL xout aout endop /* Read from a stereo bus, and then clear the bus aL, aR bus_read Sbus aL left channel aR right channel Sbus bus name */ opcode bus_read, aa, S Sbus xin SbusL, SbusR bus_name Sbus aL chnget SbusL aR chnget SbusR chnclear SbusL chnclear SbusR xout aL, aR endop /* Read from a mono bus (or left channel of a stereo bus), and then clear the bus aout bus_read Sbus aout output audio Sbus bus name */ opcode bus_read, a, S Sbus xin SbusL, S_ bus_name Sbus aout chnget SbusL chnclear SbusL xout aout endop /* Clear a stereo bus bus_clear Sbus Sbus bus name */ opcode bus_clear, 0, S Sbus xin SbusL, SbusR bus_name Sbus chnclear SbusL chnclear SbusR endop /* Clear a mono bus (or left channel of a stereo bus) bus_clear_mono Sbus Sbus bus name */ opcode bus_clear_mono, 0, S Sbus xin SbusL, S_ bus_name Sbus chnclear SbusL endop /* Set to a stereo bus bus_set Sbus, aL, aR Sbus bus name aL left channel aR right channel */ opcode bus_set, 0, Saa Sbus, aL, aR xin SbusL, SbusR bus_name Sbus chnset aL, SbusL chnset aR, SbusR endop /* Set to a mono bus (or left channel of a stereo bus) bus_set Sbus, ain Sbus bus name ain input audio */ opcode bus_set, 0, Sa Sbus, ain xin SbusL, S_ bus_name Sbus chnset ain, SbusL endop /* Mix to a stereo bus bus_mix Sbus, aL, aR Sbus bus name aL left channel aR right channel */ opcode bus_mix, 0, Saa Sbus, aL, aR xin SbusL, SbusR bus_name Sbus chnmix aL, SbusL chnmix aR, SbusR endop /* Mix to a mono bus (or left channel of a stereo bus) bus_mix Sbus, ain Sbus bus name aL left channel aR right channel */ opcode bus_mix, 0, Sa Sbus, ain xin SbusL, S_ bus_name Sbus chnmix ain, SbusL endop /* Mix to master bus bus_masterout aL, aR aL left channel aR right channel */ opcode bus_masterout, 0, aa aL, aR xin chnmix aL, "mainL" chnmix aR, "mainR" endop /* Mix mono signal to master bus, equally across left and right bus_masterout ain ain input audio */ opcode bus_masterout, 0, a ain xin chnmix ain, "mainL" chnmix ain, "mainR" endop /* Record a bus to a wave file bus_record Sbus, Spath Sbus bus name Spath path to file to record to */ opcode bus_record, 0, SS Sbus, Spath xin aL, aR bus_tap Sbus fout Spath, 14, aL, aR endop /* Record a mono bus (or left channel of a stereo bus) to a wave file bus_record_mono Sbus, Spath Sbus bus name Spath path to file to record to */ opcode bus_record_mono, 0, SS Sbus, Spath xin asig bus_tap Sbus fout Spath, 14, asig endop /* Main output: anything mixed to the "main" bus goes to main outputs */ #ifdef BUS_MAINMIXER instr _mainmixer aL, aR bus_read "main" aL = aL * gkmastervolume aR = aR * gkmastervolume outs aL, aR endin schedule("_mainmixer", 0, -1) #end #end