Saitek P990 Dual Analog PAD
|
|
Bookmark Saitek P990 Dual Analog PAD |
About Saitek P990 Dual Analog PADHere you can find all about Saitek P990 Dual Analog PAD like hid software and other informations. For example: driver.
Saitek P990 Dual Analog PAD manual (user guide) is ready to download for free.
On the bottom of page users can write a review. If you own a Saitek P990 Dual Analog PAD please write about it to help other people. [ Report abuse or wrong photo | Share your Saitek P990 Dual Analog PAD photo ]
Manual
Preview of first few manual pages (at low quality). Check before download. Click to enlarge.
Download
(English)Saitek P990 Dual Analog PAD, size: 181 KB |
Saitek P990 Dual Analog PAD
Video review
GRID on overclocked PC (Vista OS)
User reviews and opinions
| andrewbray |
2:40am on Wednesday, September 8th, 2010 ![]() |
| I used this controller for emulated NES, SNES, N64, and other games and worked great with the vibration! | |
| dinesh.upare@gmx.net |
5:45am on Sunday, August 22nd, 2010 ![]() |
| I run Ubuntu and use GFCEU (the NES emulator) and ZNES. So far, its worked like a charm, totally painless. For $20 a worthwhile buy, I may at some point figure out how to connect a PS3 remote. | |
| about Phentermine |
11:47pm on Sunday, June 27th, 2010 ![]() |
| Saitek P990 Dual Analog Controller Product works great out the box as expected. All i can fairly review it on for now. | |
| TerryE |
3:10am on Tuesday, May 11th, 2010 ![]() |
| Price was reasonable compared to similar game pads. 8-way D-pad broke after a few months of use. | |
| AnnSwi |
3:11am on Friday, March 19th, 2010 ![]() |
| Good body...CHEAP parts..NOT DURABLE I bought this controller back in 2007. The 6 front buttons are really what made me buy it. Works with (Ubuntu) Linux This pad is sweet with the various Emulators in Ubuntu 9.10. Great feel and function This is my second Saitek product (I also own an Eclipse II back-lit keyboard). | |
Comments posted on www.ps2netdrivers.net are solely the views and opinions of the people posting them and do not necessarily reflect the views or opinions of us.
Documents

ABIT ( www.abit-usa.com) ABIT AB9 QUADGT S775/I/L ATX MB ABIT IP35V S775 ATX MB ABIT IX38 QUAD GT S775 MB ABIT IP35 PRO XE S775 ATX MB ABIT IS85 S775/I/V MATX MB ABIT SG80 DC S775/S/V MATX MB ABIT FATAL1TY F-I90HD S775/A/L MATX MB ABIT LG95 S775/I/V/L MATX MB ABIT I45CV S775/945GC/133 MATX MB ABIT NF-M2PV AM2+/AM2 MATX MB ASROCK ( www.asrock.com) ASROCK ALIVENF6P-VSTA AM2/N/V MATX MB ASROCK CONROE1333-D667 S775/I/V MATX MB ASROCK A780FULLDP AM2 MATX MB ASUS ( www.asus.com) ASUS M2N-MX-SE-PLUS AM2 MB ASUS P5N-MX S775 MATX MB ASUS M3A78-EM MB ASUS P5N73-AM MATX MB GIGABYTE (www.gigabyte.com) GIGABYTE GA-EP35-DS3L S775 ATX MB GIGABYTE GA-EP45-DS3L S775 ATX MB FOXCONN 661MX-PLUS S478 SIS661+946L INTEL D201GLYL2 MB W/CELERON 1.2GHZ CPU Other models available 3.5 Inch SATA Call for Seagate Volume PricingStarting at Just 5pcs!! SEAGATE SEAGATE SEAGATE SEAGATE W5Y SEAGATE SEAGATE 80G SATAII HD W5Y 160G SATAII HD W5Y 250G SATAII HD W5Y 320G SATAII 16M 7200 500G SATAII 32M HD 640G SATAII 32M HD
Pricing 2.5 Inch IDE SEAGATE 80G 5400RPM 2.5" IDE NOTEBOOK HDD SEAGATE 120G 5400RPM 2.5" IDE NOTEBOOK HDD SEAGATE 160G 5400RPM 2.5" IDE NOTEBOOK HDD 2.5 Inch SATA SEAGATE 80G 5400RPM 2.5" SATA NOTEBOOK HDD SEAGATE 120G 5400RPM 2.5" SATA NOTEBOOK HDD SEAGATE 160G 5400RPM 2.5" SATA NOTEBOOK HDD SEAGATE 250G 5400RPM 2.5" SATA NOTEBOOK HDD SEAGATE 250G 7200RPM 2.5" SATA NOTEBOOK HDD SEAGATE 320G 5400RPM 2.5" SATA NOTEBOOK HDD External/Backup SEAGATE 80G FREEAGENT ST900803FGA1E1-RK SEAGATE 120G FREEAGENT ST901203FGA1E1-RK SEAGATE 160G FREEAGENT ST901603FGA1E1-RK WESTERN DIGITAL MYBOOK 500G WDH1Q5000N BROWNBOX W6M Hard Drive Accessories & Cables THERMALTAKE 5.25" DRIVE BAY KIT A2021 THERMALTAKE A2309 ICAGE W/ 12CM FAN THERMALTAKE 3.5" ENCLOSURE A2398 THERMALTAKE A2395 3.5" USB/ESATA ELCO THERMALTAKE A2396 3.5" USB/ESATA ELCO THERMALTAKE EA2005 2.5" SATA TO ESATA BL THERMALTAKE EA2006 2.5" SATA TO ESATA SI THERMALTAKE N0012USU 3.5" SATA /W FAN THERMALTAKE HDDOCKING 3.5" SATA N0028USU THERMALTAKE N0029USU HDDOCKING
SEAGATE 750G SATAII 32M HD SEAGATE 1TB SATAII 32M HD Call for 3.5 Inch IDE Availability &
VANTEC CB-ISATAU2 IDE/SATA TO USB ADAPTO VANTEC MRK-200ST-BK SATA HD MOBILE RACK VANTEC MRK-102FD HD RACK W/ FAN BEIGE VANTEC MRK-300ST-BK SATA HD MOBILE RACK VANTEC NST-360U2-BK ALUMINUM ENCLOSURE VANTEC NST-360SU-BK 3.5 SATA ENCLOSURE BLACK VANTEC NST-360SU-BL 3.5" SATA/USB ENCLOSURE VANTEC NST-360UF-BK 3.5" FW/USB ENCLO BL VANTEC NST-260SU-BK 2.5 USB ENCLO BLACK AMPAQS XS-3500SU-BK 3.5" BLACK EXT ENCLO AMPAQS GP-EN25U2-S3-BK BLK 2.5"EXT ENCL XIMETA NETDISK ENCLOSURE SILVER KNDMENCL
SHUTTLE SHUTTLE B-BONE SHUTTLE BONE SHUTTLE B-BONE
( www.shuttle.com) XPC SD30G2 S775 BLACK XPC SX38P2 PRO BLACK BKPC K45-K1-BK-V1 BLACK
POWERCOLOR HD2400PRO 256M PCI-E POWERCOLOR HD2600PRO 512M PCI-E POWERCOLOR X1950PRO 512M PCIE POWERCOLOR X2600XT 512M PCI-E HDCP POWERCOLOR HD3650 512M PCIE DUAL DVI PNY 7600GS 512M PCI-E PNY 7300GT 256M PCI-E PNY 8800GTS 320M PCI-E PNY 8500GT 512M PCI-E PNY 8600GT 256M PCI-E PNY 8600GTS 256M PCI-E PNY VERTO 8800GTS 640MB PCI-E PNY 8400GS 256M PCI-E PNY 8800GT 512 PCIE PNY 8600GT 512M DDR3 PCIE PNY 9600GT 512M DDR3 PCIE LEADTEK PX9500GT 512M DDR3 PCIE LEADTEK PX8500GT 512M VGA/DVI/HDTV PCIE LEADTEK PX8400GS 256M HM512M DVI/HDTV LEADTEK PX8600GT TDH DDR2 512M PCI-E LEADTEK PX9600GT 512M DDR3 PCIE LEADTEK PX9800GT 512M PCI-E LEADTEK PX9500GT 512M DDR2 PCIE LEADTEK HDTV CINEMA PCI ATSC+NTSC LEADTEK PXTV1200 PCI-E NTSC+FM+MPEGII SAPPHIRE X1650 256M DVI/VGA/VO PCIE SAPPHIRE VCX X1550 256MB PCIE SAPPHIRE HD2600PRO 512M PCIE
AGP EVGA 256-A8-N341-LX GF6200 256MB AGP PCI-E POWERCOLOR X1950PRO EXT 512M PCI-E POWERCOLOR X1550 512M PCI-E POWERCOLOR X1650 512MB DDR2 PCI-E POWERCOLOR X1550 256M PCI-E POWERCOLOR X1650 PRO 512M PCIE POWERCOLOR X1650 256M PCI-E POWERCOLOR X1950PRO 256M PCIE
LG / NEC / ACER ACER X223WBD 22" LCD BLACK 2500:1 ACER X193WB 19" LCD WIDE BLACK ACER X203WBD 20" W/S TFTLCD ET.DX3WP.001 ACER X173WB 17" WIDESCREEN ET.BX3WP.002 ACER X183HB 18.5" WIDESCREEN LCD MONITOR LG L1734S-BN 17" LCD BLACK 5MS
700:1 LG W2242TQ 22" WIDE LCD 8000:1 2MS SPECIAL PURCHASE LG W1942TQ-BF 19" WIDE 8000:1 2MS BLACK LG W2042TQ-BF 20" WIDE 8000:1 2MS BLACK SAMSUNG 931C BLACK 19" LCD 2000:1 SAMSUNG 920NW 19" WIDE 700:1 5MS BLK SAMSUNG 2253BW 22" LCD 2MS 8000:1 SAMSUNG 2443BW 24" LCD BLK 20000:1 5MS VIEWSONIC 19" WIDE VA1926W BLK 5M 2000:1 VIEWSONIC VA2226W 22" LCD BLACK 5M VIEWSONIC VA1903WMB 19" LCD BLACK DELL E178FP 17" LCD BLACK DELL E198FP 19" LCD BLACK 8MS 800:1 BELKIN BELKIN F6B750-AVR 750VA UPS BELKIN SURGEMASTER 6OUT 4' F9H610-04 BELKIN SURGEMASTER 7OUT 12' F9H710-12 BELKIN SURGEMASTER 7OUT 6' F9H710-06 BELKIN SURGEMASTER 8OUT 12' F9S820-12 BELKIN SURGEMASTER 8OUT 6' F9S820-06 BELKIN BZ108200-06 SURGE PROTECTOR L SHA BELKIN BZ106000-10 SURGE PROTECTOR CLAMBELKIN BZ111234-10 SURGE PROTECTOR CONCE BELKIN BP112230-08 SURGE PROTECTOR 8' BELKIN BP108000-06 SURGE PROTECTOR 6' BELKIN BE108200-06 SURGEMASTER 8OUT 6' BELKIN BE112230-08 SURGEMASTER 12OUT 8'
BELKIN BE108230-06 SURGEPROTECTOR 8OUT 6 BELKIN F9H600-04CL SURGEMASTER 6OUT 4'
ThermalTake (www.thermaltake.com) THERMALTAKE VB20002SNS TENOR SILVER THERMALTAKE VB8000BNS BACH MEDIA/ BLACK THERMALTAKE VB8000SNS BACH MEDIA/ SILVER THERMALTAKE VF6000BWS LANBOX LITE BLACK THERMALTAKE WINGO V8000A SILVER ALUMINIU THERMALTAKE WINGO V8000+ SILVER ALUMINIU THERMALTAKE SHARK VA7000BWA BLACK THERMALTAKE KANDALF VA9000SWA SILVER THERMALTAKE SHARK VA7000SWA SILVER THERMALTAKE VA8003BWS ARMOR W/ FAN SIDE THERMALTAKE VG4000SWA FULL TOWER THERMALTAKE VM3000A BLACK CASE NO PS THERMALTAKE VB1000BWS SOPRANO BLACK THERMALTAKE VB1000BNS SOPRANO BLACK THERMALTAKE VB1430BWS + 430W PSU THERMALTAKE VB6000BNS SWING SERIES BLACK THERMALTAKE VB6000BWS WITH WINDOW THERMALTAKE VD2000BNS BLACK THERMALTAKE VD3000BWA BLACK NO PS THERMALTAKE VC2000BNS MAMBO BLACK THERMALTAKE VC3000BWS ARMOR BLACK W/WIND
THERMALTAKE VD6000BNS SOPRANO VX BLACK THERMALTAKE VF1000BWS GAMER CUBE BLACK THERMALTAKE VE7000BWS SOPRANO DX BLACK W THERMALTAKE VG1000BNS WING RS BLACK NO W THERMALTAKE VG8000BNS WING RS BLACK NO W THERMALTAKE VG7000BNS SOPRANO BLACK THERMALTAKE VG1430BNS WING RS 430WPS BLA THERMALTAKE VG8430BNS BLACK THERMALTAKE VG7430BWS SOPRANO BLACK CODEGEN (www.codegenworld.com) CODEGEN 3324-CA BLACK/SILVER 400W/USB2.0 CODEGEN M609-CA 500W SILVER/BLACK ATX CODEGEN 501W-3 500W BLACK ATX CODEGEN 6227-CA 500W BLACK ATX CODEGEN ATX CODEGEN CODEGEN CODEGEN 6224-RD 500W BLACK ME02-CA 500W BLACK ATX 3D19-CA 400W BLACK ATX 3327-CA 400W BLACK
Other models available AOPEN ( www.aopen.com ) AOPEN QF50A P4-350W BEIGE CASE AOPEN QF50A 350W ATX2.0 BLACK FAN & FD AOPEN QF50D BLACK W/350W ATX AOPEN QF50C SIL/BLK 350W USB/FD ATX Other models available 937PK-BLACK 4-IN-1 420W 932PA-BLACK 4-IN-1 450W 620SA-BLACK 4-IN-1 420W ANTEC, AXIO, CODEGEN, ZALMAN CODEGEN P4-450W ATX DUALFAN W/CORD RET CODEGEN P4-500W ATX 24P/12CM FAN RET CODEGEN P4-550W ATX CORD&BOX DUALFAN
THERMALTAKE W0070RUC 430W BLACK THERMALTAKE W0103RU 600W W/PFC THERMALTAKE W0129RU 600W THERMALTAKE W0118RU 350W ATX PS THERMALTAKE W0100RU 500W ATX PS THERMLATAKE W0142RU PUREPOWER 500W THERMALTAKE W0143RU PUREPOWER 550W THERMALTAKE W0146RU TR2 450W THERMALTAKE W0105RU TOUGHPOWER 700W THERMALTAKE W0144RU 600W ATX 2.2 PS THERMALTAKE W0151RU TOUGHPOWER QFAN 500W ZALMAN ZM300A-APF 300W ATX POWERSUPPLY ZALMAN ZM400A-APF 400W ATX POWERSUPPLY ZALMAN ZM460-APS 460W ATX POWERSUPPLY ZALMAN ZM600-HP 600W POWERSUPPLY MODULAR BLUESTORM 350W #FSP350-60THNR RETAIL BLUESTORM 400W #FSP400-60THNR RETAIL BLUESTORM 500W #AX500-A RETAIL FSP 350W, ATX350PA FSP 400W 8CMFAN&PCI-E-CONNECT ATX400OPA FSP 450W AX450-PN RET FSP FX600-GLN 600W RET Other models available THERMALTAKE A2358 POWER SUPPLY TESTER SHUTTLE PC40 250W P/S
BUFFALO D2U667C-S512/BR DDR512MB BUFFALO D2U667C-2G/BR DDR2GB BUFFALO D2N667C-1G/BR DDR 1G 667 SODIMM BUFFALO D2N667C-2G/BR 2G 667 SODIMM BUFFALO D2N66C-S512 512M 667 SODIMM CRUCIAL CT6464AA667/8 DDR512M DDRMHz PATRIOT PSD21G8002 1GB DDR2 RANK PATRIOT PSD22G8002 2GB DDRSINGLE BUFFALO D2U800C-1G/BJ 1GB DDRBUFFALO D2U800C-2G/BR 2GB DDRKINGSTON KVR800D2N5/1G DDR1G KINGSTON KVR800D2N5/2G DDR2G KINGSTON (www.kingston.com) KINGSTON KUSBDTI/1GB 1GB DATATRAVELER KINGSTON DTI/2GB DATA TRAVELER KINGSTON KUSBDTI/4GB 4GB DATATRAVELER KINGSTON SD/1GB SECURE DIGITAL CARD KINGSTON SD/2GB SECURE DIGITAL CARD PATRIOT (www.patriotmem.com) PATRIOT XPORTER 1GB 50X PSF1GUSB PATRIOT RAZZO PSF4GRUSB 4GB 60X PATRIOT RAZZO PSF2GRUSB 2GB 60X PATRIOT XPORTER 8GB 50X PSF8GUSB PATRIOT XPORTER 16G PSF16GRUSB PATRIOT XT 2GB 200X PEF2G200USB PATRIOT XT 4GB 200X PEF4G200USB PATRIOT PSF1GMUSB 1GB FLASH MINI USB PATRIOT PSF2GMUSB MINI XPORTER
2G 60X
AGP, EPSON, HANSOL, METROLOGIC, SYMBOL, UNITECH, ZEBRA EPSON TM-U200 DOT MATRIX KITCHEN PARLLEL PRINTER EPSON TM-U230 POS PARALLEL PRINTER SEIKO SLP100 SMART LABEL DT PRINTER SYMBOL LS4008I HANDHELD BARCODE USB SCAN ZEBRA LP2844 DIRECT THERMAL PRINTER AGP CW1616-U6 MULTRIPLE CASH DRAWER 16X16" WHITE CANON PIXMA IP3500 PRINTER CANON PIXMA MP210 AIO SCAN/PTR/COPY DELL 1720DN LASER PRINTER (4665230) 1YR SAMSUNG ML-2010R LASER PTR ML2010R/XAA LEXMARK X5470 F/S/C INK JET PTR 22N0007 *After Instant Rebate* LEXMARK X5450 MULTIFUNCTION COLOR INKJET *After Instant Rebate* BROTHER HL2040 LASER PRINTER BROTHER MFC-240C 6 IN ONE PRINTER NETGEAR PS101NA MINI PRINT SERVER HP, CANON, EPSON, SAMSUNG & LEXMARK available Original / generic toner and cartridge available CD-R 80M 50-SPINDLE CD-R 80M 100-SPINDLE W/CAKEBOX SLIVERTOP BLANK DVD+R 8X 50 SPINDLE BLANK DVD+R 8X 25 SPINDLE BLANK DVD-R 8X 4.7G 50 PACK SPINDLE BLANK DVD-R 8X 25 SPINDLE DVD-R 8X 100-SPINDLE DVD+R 8X 100-SPINDLE WHITE TOP DVD+8X 100-SPINDLE SILVER TOP
DVD+R 16X 50-SPINDLE W/CB SILVER BLANK DVD-R 8X 50/SPINDLE PREMIUM DVD-R 8X 4.7G 25/CAKEBOX DVD+R8.5GB 8X DUAL LAYER 10PCS/CAKEBOX MOTOROLA PC850 BLUETOOTH ADAPTER 22337 MOTOROLA HF820 BLUETOOTH CAR SPK 22319 MOTOROLA H700 BLUETOOTH HEADSET 22333 MOTOROLA H605 BLUETOOTH HEADSET 22327 MOTOROLA H500 BLUETOOTH HEADSET 22334 MOTOROLA H500 BLUETOOTH HEADSET PNK MOTOROLA DC800 HOME STEREO ADAPTER 22336 MOTOROLA H3 BLUETOOTH BK HEADSET 22356 SAITEK ( www.saitek.com ) SAITEK P220 USB Action Pad SAITEK P3000 Wireless Pad SAITEK P990 Dual Analog Pad SAITEK P2600 Rumble Force SAITEK PP26 P3600 ROTOR RUMBLE PAD SAITEK PP24 P3200 RUMBLE PAD SAITEK ST50 USB Action Stick SAITEK ST90 Control Stick SAITEK ST290 Control Stick SAITEK Cyborg EVO Flight Stick SAITEK CYBORG EVO FORCE FEEDBACK #PS27 SAITEK CYBORG EVO WIRELESS STICK #PS30 SAITEK X52 Flight Control System SAITEK CYBORG 3D RUMBLE FORCE STICK #J59 SAITEK PS34 X52PRO FLIGHT CONTROL SYSTEM SAITEK PZ45 PRO THROTTLE QUADRANT SAITEK PZ44 PRO FLIGHT YOKE -PRO TROTTLE SAITEK PW12U R660GT FORCE FEEDBACK WHEEL SAITEK PRO FLIGHT RUDDER PEDALS
PZ35 LOGITECH LOGITECH G25 RACING WHEEL
ARIZA 700 STB RECEIVER VIEWSAT VSPRO RECEIVER VIEWSAT ULTRA SATELLITE RECEIVER VIEWSAT PVR7000 SATELLITE RECEIVER VIEWSAT HD 9000 RECEIVER CAPTAIN 8000HD HIGHDEFINITION SETTOP BOX CAPTAIN 7100 STD DEFINITION SETTOP BOX USB SONICVIEW 8000 HD RECEIVER DD80 33" SATELLITE DISH BELL EXPRESSVU DUAL LNBF BELL EXPRESSVU 20" ELIPTICAL DISH BELL EXPRESSVU 20" DISH WITH TWO LNBF BELL EXPRESSVU 20" SKEWABLE DISH BELL EXPRESSVU 20" DISH W/ONE LNBF WINEGARD 30" DISH BULK 23" ELIPTICAL DISH BULK 24" ELLIPTICAL DISHPRO 2DUAL LNB BULK 24" ELIPTICAL DISH FTA LINEAR SINGLE LNBF GENERIC DUAL CIRCULAR LNBF GENERIC DUAL CIRCULAR LNBF 890DS OVAL QUAD POLAR LNBF LINEAR & CIRCULAR ELLIPTICALDISH 18"X24" W/3WAY LNB HOLDER CIRCULAR DSS DUAL LNBF(SQ TYPE 11250GHZ) 23" ELLIPTICAL DISK WITH 3 LNBF HOLDER 80CM DISH BULK 90CM DISH BULK 1.0 METER DISH BULK SATELLITE INLINE AMPLIFIER DMS SF95 SATELLITE FINDER SIGNAL
METER PANDORA 4X1 DISEQC SATELITE SWITCH DMS 18" - 30" DISH MOVER ATRAS EAGLE 4X3 MULTI-SWITCH DCD SW-44 MULTI SWITCH EAGLE ASP. 8 WAY MULIT SWITCH ZINWELL 4 WAY MULTI SWITCH TWO LNBF BRACKET FOR HOTDISH 75 REUSABLE WATERPROOFING FOR COAX CONNEC GENIE MOUNT TRIPPLE LNB MOUNT SG2100 SATELITE DISH MOTOR 4 LNBF BRACKET F/ELLIPTICALDISH FIX TYPE SPACELAB SW21 MULTI-DISK SWITCH SPACELAB INLINE SURGE SUPPRESSOR SL-SE1K B-TECH LCD MOUNTING BT7513 B-TECH LCD MOUNTING BT7515 B-TECH LCD MOUNTING BT7511S B-TECH PROJECTOR MOUNT BT881 B-TECH TV SHELF BT14-B B-TECH TV MOUNT BT525B B-TECH VCR MOUNT BT20B B-TECH LCD MOUNTING BT8421 B-TECH LCD MOUNTING BT8422 B-TECH LCD MOUNTING SILVER BT7510 B-TECH LCD MOUNTING BT7900S B-TECH MOUNTING BT7678S B-TECH SPEAKER MOUNTING BT77 B-TECH AV STAND 3-SHELF BTF2230 B-TECH SPEAKER MOUNTING BT15 B-TECH LCD MOUNT BT7525 B-TECH BT882S PROJECTOR MOUNT B-TECH BT7520 NON-THREADED CLAMP COLLAR B-TECH BT890S PROJECTOR TROLLEY B-TECH PLASMA/LCD MOUNT SILVER BT8432 B-TECH FLAT PANEL WALLMOUNT BT8431-S B-TECH 90" ELECTR-PROJECTOR SCREEN BTE90 B-TECH PROJECTOR MOUNT BT883 B-TECH LCD MOUNTING BT8422 BLACK B-TECH BT11 BLACK ADJUST SPK FLOOR STAND B-TECH BT332 BLACK SPK WALL MOUNT
B-TECH LCD MOUNTING BT7513 BLACK B-TECH BTM70 MANUAL 70" SCRNSIZEDIAGONAL B-TECH BT7035 SILVER ACCESSORY COLLAR B-TECH BT7036 SILVER PROJECTOR PLATFORM B-TECH BT7514 BLACK LCD WALLMONT

A tap drummer, see Figure 4
Denitions
This thesis presents several topics using specic semantics and certain words are best dened beforehand: modern: the (post-)digital age at the time of this thesis, circa June 2007; a time when Internet technology and wireless connectivity are becoming ubiquitous, mobile devices have become do-it-all miniature computers, and the use of laptop computers within live music has occurred for over 10 years traditional: being of before the modern era at the time of this thesis; usually used to refer to instruments and music produced using predigital technologies post-digital: an aesthetic created through the use of the errors and failures of digital technology and forcing such systems to do what they were not originally intended2 wearable computer: a mobile computing system worn on the body; it is important to note that a stand-alone computational system, such as a modern do-it-all cellphone, is not considered wearable within this thesis as it is not integrated into the body, but designed to be carried and manipulated by the hands one-man band: a single musician playing multiple instruments at the same time; obviously, there exist one-woman bands and both genders are inferred for the sake of simplicity cyborg: cybernetic organism, the melding of the organic and the machinic, or the engineering of a union between separate organic systems. The Cyborg Handbook [19] laptop computer: a portable computer small enough to use on ones lap, commonly referred to as a laptop; at the time of this thesis, such computers are comparable in computing power to desktop computers MIDI: the Musican Instrument Digital Interface; since 1984, this musical protocol is the current standard protocol for controlling digital instruments through discrete events
A term coined by Kim Cascone in The Aesthetics of Failure: Post-Digital Tendencies in Contemporary Computer Music [9]
OSC: Open Sound Control; an alternative to MIDI with greater speed, increased resolution, and exible addressing over an Ethernet connection GNU/Linux: a free computer operating system consisting of the Linux kernel and the GNU software suite sponsored by the Free Software Foundation3 daemon: a program that runs in the background handling continuous or periodic system functions such as power or network management MAX, MAX/MSP, Pure Data: graphical, modular, object-oriented software patching environments for realtime sound composition, processing, and generation (see also [36] and [37])
Some Remarks on Musical Instrument Design at STEIM
Despite the disembodiment of most current digital instruments, historically, there has been an interest in the body in digital instrument design. STEIM, the Studio for Electro-Instrumental Music in Amsterdam, is a research organization that pursued touch and embodiment in its instruments throughout a MIDI-revolution that further abstracted the musicians body. In 1991s Some Remarks on Musical Instrument Design at STEIM [41] Joel Ryan states that with the availability of digital musical devices in the period following the mid-1980s, the distancing of the composer though formalized musical processes shifted toward the composer/performer and a quest for immediacy in music. This immediacy is almost eortlessly achieved though digital 7
instruments, yet it is this virtue of eortlessness, the promise of the digitalmyth, that works against the actions involved in playing a traditional instrument. Ryan notes that physical eort is one of the functional requirements of traditional instruments which were developed and expanded with musical possibility, not required eort, in mind. In fact the progression of physical instruments moves toward an increase of required eort and thus it can be said that eort is closely arranged with expression in that more practice and muscular ability are required to draw out these expanded possibilities. Ryan argues that this inherent design principle is important for digital instruments in that the required physical actions and eort of the performance interface help bring to life the underlying musical processes, much like the physical sounding bodies of traditional instruments: In fact the physicality of the performance interface helps give denition to the modeling process itself. The physical relation to a model stimulates the imagination and enables the elaboration of the model using spatial and physical metaphors. The image with which the artist works to realize his or her idea is no longer a phantom, it can be touched, navigated and negotiated with. [41]
Making Motion Musical
The 1995 Making Motion Musical [45] by Todd Winkler discusses design principles for digital instruments which transform physical motion into sound. This is an important compositional problem since there is already a natural precedent for gestural mappings and their associated musical content within traditional instruments slight nger tapping on a cymbal, a dramatic foot kick of the bass drum, a rolling piano arpeggio. Winkler observes that the physical constraints of both instrument and performer dene the instruments usage: Physical constraints produce unique timberal characteristics, and suggest musical material that will be idiomatic or appropriate for a particular instruments playing technique. These reect the weight, force, pressure, speed, and range used to produce sound. In turn, the sound reects, in some way, the eort or energy used to create it. The fact that brass tones add upper partials as they grow louder is a classic example. [45] 8
Fate Norris, of Dalton, Georgia, the one-man wonder, who plays six individual instruments in an individual band, will also furnish entertainment. Mr Norris has in his band two guitars, bells, bass ddle, ddle, and mouth harp. He devoted seventeen years to mastery of his art.[46]
Joe Barrick, a carpenter and musician, turned to his skills and ingenuity when it became hard to keep anybody together to play with anybody [38]. Born to Native American Choctaw parents in Oklahoma in 1922, he began 20
Fig. 7: Joe Barrick and his piatarbajo, 1980s playing the mandolin at age 15 and quickly absorbed music o of the radio. After serving in the armed forces and settling in California as a carpenter, Barrick began playing in groups and building his own instruments rst being a guitar built out of a cows skull. When it became hard to keep a full band together, he decided to perform as a solo act and approached the problem of playing rhythm guitar using his feet. The result was the piatarbajo, a shelf arrangement containing a boardmounted guitar, bass guitar, banjo, and snare drum (see Figure 7). The right foot controls hammers that strike the instruments and the left works special treadles which operate move-able frets that the chords to be played by pushing on the appropriate strings of the guitar, bass guitar, and banjo. Each instrument has a separate pick-up played through a separate ampliers a bass amp for the bass guitar and a corresponding guitar amp for the guitar and he would arrange the speakers so that the entire performance sounded like individual musicians were playing. Motivated by music as a social event, he toured schools, festivals, and dances and his creative independence was evident: No one tells me when to practice and I can play any song I want without having to hope the rest of the band likes it. [38] Jazz musician Rahsaan Roland Kirk, Figure 8, sought to recreate the 21
Fig. 8: Rhasaan Roland Kirk, 1970s sounds of his dreams and became his own one-man band as a result. Although most one-man bands are thought of as mere novelty, Kirks serious approach to the tradition enabled him to achieve a true innovation. During live performances he hung drums, utes, and whistles around his neck and arrayed gongs, a sock cymbal, and a bass drum at his feet. He developed a method of playing 3 saxophones at once and could play 2 entirely dierent melodies while improvising a third and playing rhythm with his feet simultaneously. Roland Kirks sheer physical ability and novel approach to achieve his goals resulted in a unique musical expression.
http://www.qprox.com/downloads/datasheets/qt113 105.pdf
Fig. 31: Cheapstick : an aordable positional controller [22] foam and magnetic video tape can be used to construct a custom positional controller: the Cheapstick [22] (See Figure 31). Specialized software drivers are required to map joystick and gamepad events to musical parameters and this is accomplished within the robotcowboy project using the unit-daemon (see Section 5.3.3). Dedicated modern video game console controllers such as those for the Playstations 1-3, Gamecube, and Xbox/Xbox 360 are very durable and can be used on regular computers through third-party adapters. Examples of planned robotcowboy interfaces listed below represent a small amount of the possibilities for custom interaction:
A 16 button matrix made by wiring mechanical push buttons to the gamepads original button contacts 4 potentiometers mounted on dierent areas of the body wired to the gamepads 4 ADCs Resistive bend sensors for one hand wired to the 4 ADCs A spinning weight attached to a motor whose speed is read by an ADC A glove with simple capacitive touch sensors, QT113s, connected to optoisolators which trigger buttons Piezo discs worn on the feet which are read by the ADCs for stomp sensing
By choosing a low-cost and readily-available input platform, a greater number of varied instruments can be constructed and used in combination. It is the essence of the post-digital instrument to reuse and adapt technology, as stated by Cascone and Richards in Section 2.1, and this aesthetic choice can lead to greater creativity than the use of much more advanced yet bulky and almost prohibitively expensive interfaces such as the $650 IRCAM Eobody21. By doing some simple math, $650 / $20 = 32.5, it is obvious that having 32 possible instruments is preferable to one interface box without additional sensors and this sum, in fact, approaches the entire cost22 of the robotcowboy unit! Granted, the 100Hz sampling rate and 8 bit resolution of most gamepads are not as exible as compared to the 200 - 4000 Hz and 7 - 16 bits of many popular sensor interfaces, but the author for one does not mind this trade-o. [22]
http://www.forum.ircam.fr/361.html?&L=1 $720, see Section 6 for more details.
Fig. 32: The robotcowboy unit software owchart
Software Implementation
The software which powers the robotcowboy unit wearable computer is a custom input daemon, the Jack realtime audio daemon, and Pure Data running on GNU/Linux (Figure 32).
Operating System
GNU/Linux was chosen as it is a free, stable, and easily customizable operating system that can be slimmed down to run eciently on slower hardware. The Linux kernel23 running the robotcowboy unit, for instance, has been specially compiled for realtime audio applications. GNU/Linux has a proven track record in embedded devices, servers, and a growing desktop user base. The philosophy of the Free Software Movement 24 , whose members developed GNU/Linux, is that software should be free and its source code openly dis23 24
Velocipede: A Prototype Performance Mapping
Velocipede is this thesis most developed prototype interface mapping/musical score and is described in order to oer an example of a robotcowboy performance instrument. The physical input device is a Playstation 2 Dualshock game controller (Figure 37) connected through a USB adaptor and assigned an OSC sending address at /pd/devices/ps2black. A Pure Data patch de59
Fig. 36: The Velocipede Pure Data patch
Fig. 37: The Velocipede Dualshock controller
Fig. 38: joystick: routes the button and axis events from a specied input device OSC address nes the software score the instrumental and musical mappings of the controller. The main patch (Figure 36) consists of:
OSC transport control for cues sent to the /pd/transport address input and event routing subpatches tone control and sound generation for the Dualshocks two analog thumbsticks four rhythmic sequences triggered by the shoulder buttons a heartbeat metronome toggled via the start button or transport cue
The joystick object, ie. the box labeled joystick /ps2/black, (Figure 38) routes the button and axis events from the Dualshock and the axes and button subpatches (Figures 39 and 40) route the required axis and button events respectively to the mapping objects.
Fig. 39: axes: routes axes events
Fig. 40: buttons: routes button events
Fig. 41: heartbeat: plays a 4/4 heartbeat when the patch is active The main musical content is dened within the stick, tonecontrol, and shoulder button subpatches and heartbeat (Figure 41) provides a 4/4 beat metronome when the patch is cued and running. These mappings are represented in Figures 42 and 46. Lstick (Figure 43) and Rstick map the x and y axis of each stick to a midi sawosc additive synthesis sound object on a single channel and the incoming axis values are scaled from -32767 to 32767 down to 0 to 30. Once within the MIDI range (0-127), these values are added to osets (30, 40, 61, 71) provided by tonecontrol (Figure 44) which is toggled via the two buttons beneath the thumbsticks. As a result, the center value of the left stick defaults to MIDI note 45 (30/2 + 30) and is always 31 steps below the right stick whose value is 76 (30/2 + 61) in essence, they can be thought of as bass and treble. When the right thumbstick button is depressed, both values are increased by 10 to 55 and 86 and the left thumbstick button returns them to 45 and 76, yielding two keys in which the thumbsticks can be played. The pitches of each axis are mapped in a right-hand Cartesian fashion with a maximum and minimum of +/-30 from the center value: the pitch increases in the top and right directions and decreases towards bottom and left. Each set of voices, two for each stick are then mapped to specic channels with the top/bottom axes panned completely to the left and left/right axes panned to the right. Each of the four shoulder buttons triggers a drum sequence with its own subpatch. The L1 subpatch (Figure 45) triggers a simple 16 step sequence by opening a spigot to the heartbeat metronome when it receives a 1. The 16 beat sequence plays the pish sound object, a simple enveloped pink noise snare drum. 1s are triggers while 0s are treated as rests and the sequence is reset back to its initial position when the button is released. L1, L2, R1, and R2 have distinctive patterns and 63
http://wii.nintendo.com/controller.jsp
Since all of the inter-application communication within unit-daemon is handled within OSC, the software elements can be separated onto dierent machines over a network. A master/slave capability will be added to unitdaemon so multiple computers can send attached device events to a central audio processing station. Multiple wirelessly-networked wearable computers can be used to create an mobile electronic performance band.
Conclusions
This thesis set out to develop a live human-computer musical performance system, a technological one-man-band: the robotcowboy unit. unit oers musicians a wearable computational platform on which to develop physical controllers and software sound mappings, an adaptable electronic instrument built upon mobility and embodiment. The wearer of the system does not need anyone but his creativity and determination for an engaging performance. Through careful design decisions, the robotcowboy unit is an enabling computational platform as opposed to a laptop computer which subjugates much of a musicians ability to perform. It is not the aim of this thesis to target the laptop for ridicule, but to bring about a discussion to an alternative form of electronic instrument that can address the problems of instrumentality and mobility. It is hoped that the work of this thesis will inspire others to experiment with and develop such systems of their own to join the ranks of the robotcowboy.
References
[1] Jamioki-purejoy: A game engine and instrument for electronicallymediated musical improvisation. In Proceedings of NIME-07, New York, NY, USA, June 2007. [2] A unied toolkit for accessing human interface devices in pure data and max/msp. In Proceedings of NIME-07, New York, NY, USA, June 2007. [3] Laurie Anderson. Stories from the Nerve Bible: A Retrospective, 19721992. Harper Perennial, New York, 1994. [4] L. Ashline, William. The pariahs of sound: On the post-duchampian aesthetics of electro-acoustic improv. Contemporary Music Review, 22(4), 2003. [5] F. Bebey. African Music: A Peoples Art. Lawrence Hill, Westport, CT, 1975. [6] Bert Bongers. An interview with sensorband. Computer Music Journal, 22(1), March 1998. [7] Mark. A. Bromwich and Julie. A. Wilson. bodycoder: A sensor suit and vocal performance mechanism for real-time performance. In Proceedings of ICMC 1998, 1998. [8] Mark. A. Bromwich and Julie. A. Wilson. Lifting bodies: Interactive dance - nding new methodologies in the motifs prompted by new technology - a critique and progress report with particular reference to the bodycoder system. 2001. Available from: http://www.geocities.com/ marekbuk/EDTlift.html [cited June 2007]. [9] Kim Cascone. The aesthetics of failure: post-digital tendencies in contemporary computer music. Computer Music Journal, 24(4), Winter 2000. [10] John Croft. Theses on liveness. Organized Sound, 12(1):5966, April 2007. [11] G. Deleuze and F. Guatarii. A Thousand Plateaus: Capitalism and Schizophrenia, page 474. University of Minnesota Press, Minneapolis, MN, 1987. [12] Maywa Denki. Tsukuba music. 2007. Available from: http://www. maywadenki.com/concepts/what tsukuba.html [cited June 2007]. 74
// mabey add commandline options int main(int argc, char **argv) {
if(config.get("log") == "true") { // redirect cout to file streambuf *psbuf; filestr.open ("log.txt"); psbuf = filestr.rdbuf(); cout.rdbuf(psbuf); } cout << "******************" << endl; cout << "*** Unit Begin ***" << endl; cout << "******************" << endl; // load files cout << endl << "*** Load Config ***" << endl; if(config.load() < 0) return -1; cout << endl << "*** Load Playlist ***" << endl; if(playlist.load() < 0) return -1; // start server cout << endl << "*** OSC Server Begin ***" << endl; cout << "OSC Server Starting up." << endl; setup_server(config.get("server_port")); server.startListening(); cout << ". Server running" << endl; // start jack Unit my_unit; cout << endl << "*** Start Jack ***" << endl; if(my_unit.startJack(config.get("jack_command")) < 0) { cout << "Jack failed to start. exiting" << endl; return EXIT_FAILURE; } // salutation sleep(1); sounds.play(config.get("sound_folder")+"/you_are_robotcowboy.wav"); // setup devices cout << endl << "*** Setup Devices ***" << endl; input_devices.config("joy_names.txt"); input_devices.setupOSC((char *) config.get("send_addr").c_str(), (char *) config.get("send_port").c_str(), "/pd/devices/"); button_box.setBaud((char *) config.get("baud").c_str()); button_box.setupOSC((char *) config.get("send_addr").c_str(), (char *) config.get("send_port").c_str(), "/pd/transport"); if(button_box.openDev((char *) config.get("button_box").c_str(), (char *) config.get("baud").c_str()) == 0) cout << "Button Box opened at " << config.get("button_box") << endl; input_devices.setup(); if(config.get("debug") == "true") { button_box.printEvents(true); input_devices.printEvents(true); } // open pd with control patch cout << endl << "*** Start Pd ***" << endl; my_unit.startPd(config.get("puredata_command")); // open first patch
sleep(3); osc_send = lo_address_new((char *) config.get("send_addr").c_str(), (char *) config.get("send_port").c_str ()); lo_send(osc_send, "/pd/patch/open", "ss", (char *) playlist.file().c_str(), (char *) playlist.path().c_str ()); // connect midi my_unit.aconnect("UA-25", "Pure Data"); // ready sound sounds.play(config.get("sound_folder")+"/unit_ready.wav"); // signal handling signal(SIGTERM, onExit); signal(SIGQUIT, onExit); signal(SIGINT, onExit); // program main loop while (!done) { input_devices.listen(); button_box.listen(); // is there a load? if(button_box.check() > 0) { sounds.play(config.get("sound_folder")+"/bang.wav"); lo_send(osc_send, "/pd/patch/close", "ss", (char *) playlist.file().c_str(), (char *) playlist.path ().c_str()); playlist.next(); lo_send(osc_send, "/pd/patch/open", "ss", (char *) playlist.file().c_str(), (char *) playlist.path ().c_str()); } usleep(10); // debounce. important! } // end main loop cout << endl << "*** Unit Shut Down ***" << endl; // end sound sounds.play(config.get("sound_folder")+"/unit_signing_off.wav"); sleep(3); cout << endl << "Shutting down devices." << endl; // input_devices.cleanup(); button_box.closeDev(); cout << ". devices shut down" << endl; cout << endl << "Stopping Pure Data and Jack." << endl; my_unit.stopPd(); cout << ". Pure Data stopped" << endl; my_unit.stopJack(); cout << ". Jack stopped" << endl; cout << endl << "Stopping Osc Server." << endl; server.stopListening(); cout << ". server stopped" << endl; // wait for all children just in case my_unit.cleanup();
// timestamp of last 'D' event // printing control
Button_Box.cpp
Copyright (C) 2007 Dan Wilcox This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include "Button_Box.h" Button_Box::Button_Box() { //timestamp = 0; } Button_Box::~Button_Box() { //dtor } int Button_Box::check() { // device is not open, so dont do anything if(dev_fd == -1) return 0; if(num_bytes > 0) { // read anything?
// box only sends 1 char if(buffer[0] == 'D') // button down { time(×tamp); if(print_events) // print event info cout << "Button_Box: recieved \"" << buffer[0] << "\"" << endl; } else if(buffer[0] == 'U') { time_t now; time(&now); // button up
double t = difftime(now, timestamp); if(t >= 2) // send a load event { cout << "Button_Box: Load!" << endl; return 1; } else // send a cue event { if(lo_send(osc_server, addr, "s", "cue") == -1) if(print_events) cout << "OSC error" << lo_address_errno(osc_server) << lo_address_errstr(osc_server) << endl; cout << "Button_Box: Cue!" << endl; }
if(print_events) // print event info cout << "Button_Box: recieved \"" << buffer[0] << "\" " << t << endl; } } return 0; // nothing done or cue }
Config.h
Copyright (C) 2007 Dan Wilcox This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #ifndef CONFIG_H #define CONFIG_H #include #include #include #include #include <iostream> <fstream> <sstream> <string> <map>
if(!fin) // open failed { cout << "Config: error opening file \"" << filename << "\"" << endl; return -1; } cout << "Config: loading " << filename << endl; string s; while(getline(fin, s)) { if(s.size() >= 1 && s[0] == '#') {} // cout << " ignoring comment: " << s << endl; else if(s.size() >= 2) { string key, val; key = s.substr(s.find_first_of("\"")+1, s.find_last_of("\"")-1); val = s.substr(s.find_last_of("\"")+2, s.size()); cout << " key: \"" << key << "\" val: \"" << val << "\"" << endl; config_map.insert(make_pair(key, val)); } } cout << "Config: ready" << endl; fin.close(); return 0; } string Config::get(char* key) { return config_map[key]; } void Config::print() { int i = 0; map<string, string>::iterator c; for(c = config_map.begin(); c != config_map.end(); c++) { cout << i << " key: " << c->first << " val: " << c->second << endl; i++; } }
Devices.h
Copyright (C) 2007 Dan Wilcox This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #ifndef DEVICES_H #define DEVICES_H #include #include #include #include <string> <sstream> <map> <vector>
#include "Config.h" #include "Joystick_Device.h" #include "Serial_Device.h" class Devices { public: Devices(); virtual ~Devices(); /** \brief \param \param \param Setup the OSC connection info ip_ ip address to OSC server to send to, NULL sets localhost "127.0.0.1" port_ port number of OSC server, ex. "4000" osc_addr_ OSC address to send to, ex. "/test/serial/1"
*/ void setupOSC(char *ip_, char *port_, char *osc_addr_); /** \brief Opens all currently plugged in devices
Called to init existing devices before starting event listening */ void setup(); /** \brief \param Loads the OSC address config file file filename to the config file
Ignores lines beginning with '#', format is 'usb dev name' 'OSC device address' with a space in between ex. # saitek events sent to "/target address/saitek" "Saitek P990 Dual Analog Pad" saitek returns 0 on success or -1 if the file cannot be loaded (i.e. found) Note: very dumb, does not check for bad keys/vals so config file must be correct */ int config(char *file);
/** \brief Closes each joystick and removes it from the list */ void cleanup(); /** \brief Toggles debug event output \param yesno true = prints all button, axes event information */ void printEvents(bool yesno); /** \brief Checks for and sends device events */ void listen(); /** \brief Adds joystick to active list and opens it \param dev name of the device, ie. '/dev/input/js0' */ int joyRegister(string dev); /** \brief Removes joystick to active list and closes it \param dev name of the device, ie. '/dev/input/js0' */ int joyUnregister(string dev); /** \brief debug print of active device list */ void printMap(); protected: private: char *ip; // ip to send device events to char *port; // port char *osc_addr; // base OSC address to send to, device addr is concatenated map<string, Joystick_Device> joy_devices; // active device list vector<Serial_Device> serial_devices; // serial device list Config *name_mappings; }; #endif // DEVICES_H // device name -> OSC address config file
Devices.cpp
Copyright (C) 2007 Dan Wilcox This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include "Devices.h" Devices::Devices() { ip = NULL; port = NULL; osc_addr = NULL; name_mappings = NULL; } Devices::~Devices() { //dtor } void Devices::setupOSC(char *ip_, char *port_, char *osc_addr_) { ip = ip_; port = port_; osc_addr = osc_addr_; } /* Opens all exisiting linux joystick devices */ void Devices::setup() { FILE *fpipe; char line[100]; // call ls on the /dev/input dir to get available joysticks if(!(fpipe = (FILE*) popen("ls /dev/input | grep js*", "r"))) { cout << "Devices: ls /dev/input failed run" << endl; return; // error } while(fgets(line, sizeof line, fpipe) != NULL) { string temp = line; // grab joy name istringstream ss(temp); string dev; ss >> dev; joyRegister(dev); } return; } int Devices::config(char *file) {
char *ip; char *port; char *addr; string axis_addr; string button_addr; // printing control bool print_events; }; #endif // JOYSTICK_DEVICE_H
Joystick_Device.cpp
Copyright (C) 2007 Dan Wilcox This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include "Joystick_Device.h" Joystick_Device::Joystick_Device() { // linux joystick info dev_name = NULL; js_name = NULL; dev_fd = -1; num_axes = 0; num_buttons = 0; // setup timeouts tv.tv_sec = 1; tv.tv_usec = 0; // osc connection info osc_server = NULL; ip = ""; port = ""; addr = ""; axis_addr = ""; button_addr = ""; // printing control print_events = false; } Joystick_Device::~Joystick_Device() { //dtor } /* open device with linux joystick dev name aka /dev/js0 returns 0 on success and -1 on failure */ int Joystick_Device::openDev(char *dev) { // open the dev string dev_path = "/dev/input/" + (string) dev; if((dev_fd = open((char *) dev_path.c_str(), O_RDONLY)) < 0) { cout << "Joystick_Device: Bad joystick device: " << dev << " " << strerror(errno) << endl; return -1; } dev_name = dev; // set nonblocking fcntl(dev_fd, F_SETFL, O_NONBLOCK); // query for device info
int version; ioctl(dev_fd, JSIOCGVERSION, &version); // exit if using old (non-event) joystick api if(version < 0x010000) { cout << "Joystick_Device: driver for " << dev_name << " uses old joy device version < 1.0" << endl; return -1; } ioctl(dev_fd, JSIOCGAXES, (int) &num_axes); ioctl(dev_fd, JSIOCGBUTTONS, (int) &num_buttons); js_name = new char[128]; ioctl(dev_fd, JSIOCGNAME(128), js_name); return 0; } /* close device */ void Joystick_Device::closeDev() { // close joystick close(dev_fd); // free addr lo_address_free(osc_server); // reinit vals incase we want to reuse this object js_name = NULL; dev_fd = -1; num_axes = 0; num_buttons = 0; // osc connection info osc_server = NULL; ip = ""; port = ""; addr = ""; axis_addr = ""; button_addr = ""; } /* setup the OSC connection info */ void Joystick_Device::setupOSC(char *ip_, char *port_, char *osc_addr) { ip = ip_; port = port_; addr = osc_addr; // setup osc send address osc_server = lo_address_new(ip, port); // set addr axis_addr = button_addr = } /* handles device events and sends correpsonding OSC messages call this inside a loop, is nonblocking */ void Joystick_Device::listen() { // device is not open, so dont do anything if(dev_fd == -1) return; FD_ZERO(&set);
int listen(); /** \brief \param \param Send some bytes from a char device send_chars char buffer to send n_bytes number of bytes to send from send_chars buffer
returns number of bytes read or -1 on error Note: returns 0 if device is not open */ int send(unsigned char *send_chars, int n_bytes); /** \brief \param Set the speed of the serial device baud baud speed of the device: baud baud baud 134 134.5 baud baud baud baud baud 12001200 baud 18001800 baud 24002400 baud 48004800 baud 96009600 baud 1920019200 baud 3840038400 baud 5760057,600 baud 115200115,200 baud
*/ int setBaud(char *baud); /** \brief Get pointer to char buffer
returns pointer to serial device input buffer */ inline unsigned char *getBuffer() {return buffer;}; /** \brief Returns true if device is open */ inline bool isOpen() {if(dev_fd > -1) return true; else return false;} protected: // serial device info char *dev_name; // int dev_fd; // unsigned char *buffer; // int num_bytes; // fd_set set; // set for timeval tv; // timeout // osc connection info lo_address osc_server; char *ip; char *port; char *addr; private: }; #endif // SERIAL_DEVICE_H
port name of the serial device serial device file descriptor Input buffer Number of bytes read select for select
Serial_Device.cpp
Copyright (C) 2007 Dan Wilcox This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include "Serial_Device.h" Serial_Device::Serial_Device() { // serial device info dev_name = NULL; dev_fd = -1; buffer = new unsigned char[255]; num_bytes = 0; // setup timeouts tv.tv_sec = 1; tv.tv_usec = 0; // osc connection info osc_server = NULL; ip = NULL; port = NULL; addr = NULL; } Serial_Device::~Serial_Device() { //dtor } /* open serial port with the dev name and speed returns 0 on success and -1 on failure */ int Serial_Device::openDev(char *dev, char *baud) { // open port : read/write | not controlling | non blocking | ignore DCD state if((dev_fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY)) == -1) { // Could not open the port. cout << "Serial_Device: Unable to open \"" << dev << "\": " << strerror(errno) << return -1; // error } fcntl(dev_fd, F_SETFL, FNONBLOCK); setBaud(baud); dev_name = dev; return 0; } /* close serial device */ void Serial_Device::closeDev() { // close serial port // ok // set speed // set nonblocking
: " << inport << " id: " << in_id << endl;
// if jack stalls due to soundcard "in use", then kill it mean likes if(jack.status() != 'N') { jack.sendSignal(SIGKILL); cout << "Unit: jackd hung, so I had to kill it" << endl; } */ return 0; } int Unit::stopPd() { pd.sendSignal(SIGINT); return 0; } void Unit::cleanup() { if(waitpid(-1, NULL, 0) == -1) cout << "Wait error" << endl; }
# #config text file #'#' lines are comments # #format: key value #must be a space between! # server stuff server_addr 127.0.0.1 server_port 7770 # send osc stuff send_addr 127.0.0.1 send_port 8880 # button box dev name button_box /dev/ttyUSB0 baud 9600 # sound folder (no trailing slash) sound_folder sounds # don't use the realtime option on both jack and pd at the same time, # it can cause problems # jack commandline jack_command jackd -R -p128 -dalsa -dhw:1 -r44100 -p512 -n3 -S # pd commandline with control patch puredata_command pd -alsamidi -jack /home/dano/Creative/pd/Unit-Control.pd # log? - aka print all output to a log file, otherwise to stdout log false # debug - aka print lots of events debug false
# #playlist text file # #'#' lines are comments # /home/dano/Creative/pd/BimBom.pd /home/dano/Creative/pd/RunningMan.pd
# #joystick name mappings #'#' lines are comments # #format: key value #must be a space between! "LuenKeung Co.,Ltd USB Joystick" ps2black
"Saitek P990 Dual Analog Pad" saitek "WiseGroup.,Ltd MP-8866 Dual USB Joypad" ps2purple
main.cpp unit-announce
Copyright (C) 2007 Dan Wilcox This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include <iostream> #include <unistd.h> #include <string> #include "lo/lo.h" using namespace std; int main(int argc, char *argv[]) { if(argc < 4) { cout << "Usage: unit-announce <osc_dest_addr> <osc_dest_port> <device_name>" << endl << endl; exit(EXIT_FAILURE); } string addr = (string) argv[1]; string port = (string) argv[2]; string device = (string) argv[3]; // check address arg for(int c = 0; c < (int) addr.length(); c++) { if(!isgraph((char) addr.at(c))) { cout << "Invalid addr name \"" << addr << "\"" << endl; exit(EXIT_FAILURE); } } // check port arg for(int c = 0; c < (int) port.length(); c++) { if(!isdigit((char) port.at(c))) { cout << "Invalid port number \"" << port << "\"" << endl; exit(EXIT_FAILURE); } } // check device name arg for(int c = 0; c < (int) port.length(); c++) { if(!isalnum((char) port.at(c))) { cout << "Invalid device name \"" << device << "\"" << endl; exit(EXIT_FAILURE); } }
Tags
Nikkor DMR-EH50EG BL-PA300 LS-color KEH-P4025 Iaudio M5 X364DN Yamaha P200 AQV09NSB Airoma IPE 3M X62W 943NX Series III DS5001 TG-3269 Vluu I100 Sbcru254 00H TS250GSJ25m-R DMC-LX2EGM Conquer-renegade HDR-FX1 Photo PM-350 ESF4120 SCC-643 Plcxu50A NN-S335WF Samsung 932B SC-VK81D Maxima-2004 Ec 125 DJ-X7E GT110 Recettes ICD-55 2 7 IDC A09 32JW-76E Driver 10191 6715B T CNC EX-Z120 R-09HR 2410-304S 9800XT PX-G920 RTX-2007 RMR606hgpa TK-2202 Bulldog Plus Lexmark E320 U1644NO JBL G40 Optimizer VR675 Forever 980 FSM726S Motoculteur 8000 Festina 6399 Bose 161 QW1260 Travelmate-4600 75wxst Asus A6 SC-5620 D-40 Zoom Blazer 1997 Arcanum Frontier-crew-CAB-2002 DR4912B MP-C848 Sl-610 Lexmark E323 KX-TGA300 Garmin 376C 25PT4523 58 VPC-FH1EX 1400C Korg NS5R SA10003 Acerpower SD LS-9000 ED NV-GS400GN ZWG3121 DMC-TZ4 CVA-1014RR-rb-R KV-32CS70K YH-999 Gr-dv500 CR-8530 1220CSE Piano CD5400 PL-X55Z 48P7400 DPX-502 RBC2110 RVD-6090R 20PT1553-00 Xpressmusic
manuel d'instructions, Guide de l'utilisateur | Manual de instrucciones, Instrucciones de uso | Bedienungsanleitung, Bedienungsanleitung | Manual de Instruções, guia do usuário | инструкция | návod na použitie, Užívateľská príručka, návod k použití | bruksanvisningen | instrukcja, podręcznik użytkownika | kullanım kılavuzu, Kullanım | kézikönyv, használati útmutató | manuale di istruzioni, istruzioni d'uso | handleiding, gebruikershandleiding
Sitemap
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








1. Saitek P990 Dual Analog Game Pad
2. PREMIUM USB Adapter Power Kit for Sony Ericsson P990 Phone! Includes : (1) A Days Tech Charging USB Data Cable, (1) USB Car Charger Adapter (1) USB Folding Blade Wall Charger Adapter.
3. Saitek P2600 Rumble Pad PC Game Controller
4. Saitek Wireless Game Pad P2900
5. Saitek P2500 Rumble Force PC Game Pad
6. Saitek P880 Dual Analog PC Game Pad



