joystick — Reads data from a joystick controller.
Note | |
---|---|
Please note that this opcode is currently only supported on GNU/Linux. |
kdevice -- the index of the joystick device, either /dev/jsN or /dev/input/jsN.
ktab -- A table to hold input results, should be at least enough elements to store one value for each stick axis and one for each button + 2. The first two elements of the table are initialized with the number of axes and the number of buttons, respectively, when a joystick is opened. If a joystick is unplugged during performance, the opcode will repeatedly attempt to reopen the device with a delay between attempts.
Here is an example of the joystick opcode. Play joystick.csd
See the sections Real-time Audio and Command Line Flags for more information on using command line flags.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform -odac ;;;realtime audio out ;-iadc ;;;uncomment -iadc if realtime audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o joystick.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 nchnls = 2 ;0dbfs = 1 instr 1 ; gives information about your joystick in real time kmask joystick 0, 1 kidx = 2 kaxes tab 0, 1 ; number of axes has been stored in position 0 kbuttons tab 1, 1 ; number of buttons has been stored in position 1 printf "this joystick has %d axes, %d buttons\n", kidx, kaxes, kbuttons kuniq init 0 reportaxis: ; first we see if we have any x/y input kcheck = kmask & (1<<kidx) if kcheck == 0 kgoto nexta kres tab kidx, 1 kuniq = kuniq + 1 ; to be sure to make the printf print printf "axis %d, value %6d\n", kuniq, kidx-2, kres nexta: kidx = kidx+1 if kidx < (kaxes+2) kgoto reportaxis reportbutton: ; now we check for any buttons pressed kcheck = kmask & 1<<kidx if kcheck == 0 kgoto nextb kres tab kidx, 1 ; a button has been pressed, get from table printf "button %d, pushed\n", kidx*kres, (kidx-(kaxes+2)) printf "button %d, released\n", kidx*(1-kres), (kidx-(kaxes+2)) nextb: kidx = kidx+1 if kidx < (kaxes+kbuttons+2) kgoto reportbutton endin </CsInstruments> <CsScore> f1 0 32 7 0 7 0 ; will hold the joystick data i1 0 60000 e </CsScore> </CsoundSynthesizer>
Here is another example of the joystick opcode. Play joystick-2.csd
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform -odac ;;;realtime audio out ;-iadc ;;;uncomment -iadc if realtime audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o joystick-2.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 nchnls = 2 ;0dbfs = 1 instr 1 kmask joystick 0, 1 kaxes init 0 kbuttons init 0 kx0 init 0 ; first two entries are # of axes and # of buttons, ky0 init 0 ; then axes, then buttons vtabk 0, 1, kaxes, kbuttons, kx0, ky0 kidx = 2+kaxes buttons: kcheck = kmask & 1<<kidx ; if the button was just now pressed and... kres tab kidx, 1 ; if button value is one, start a note schedkwhen kres*kcheck, 1, 20, 2, 0, 60000, kidx, kx0, ky0 kidx = kidx+1 if kidx < (kaxes+kbuttons+2) kgoto buttons endin instr 2 ; play a tone until the button is released kstop tab p4, 1 ; when this button is released, we fade out ihz init cpsoct(((p5+32767)/9362)+5) ; ~ 30 hz to 4khz print ihz ito init ampdb(((p6+32767)/2184)+60) ; ~ 60 - 90 db kenv init 0 kdelta init ito/(kr*10) if kstop == 1 kgoto output if kdelta < 0 kgoto output kdelta = kdelta*-1 output: kenv = kenv+kdelta kenv limit kenv, 0, ito aout oscils 1, ihz, 0 aout = kenv*aout outs aout, aout if kenv != 0 kgoto noexit if kdelta > 0 kgoto noexit turnoff noexit: endin </CsInstruments> <CsScore> f1 0 32 7 0 7 0 ; will hold the joystick data i1 0 60000 e </CsScore> </CsoundSynthesizer>