joystick
Reads data from a Linux joystick controller
Plugin opcode in joystick.
Syntax
kres joystick kdevice, ktab
Note
Please note that this opcode is currently only supported on GNU/Linux.
kdevice -- the index of the joystick device, either /dev/js_N_ or /dev/input/js_N_.
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.
Examples
Here is an example of the joystick opcode. It uses the file joystick.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.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. It uses the file 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>
|
See also
Sensing and Control: Keyboard and mouse sensing
non-MIDI devices
Credits
Author: Justin Glenn Smith
2010
New in version 5.17.12