'{$STAMP BS2p} ' {$PBASIC 2.5} '-------------------------------------------------------------------------- ' ' ' ----------[ Title ]------------------------------------------------------ ' ' File........... Faces.bsp ' Author......... Thomas Charveriat ' E-mail......... tc262@columbia.edu ' WWW............ http://www.montcada5.com ' WWW............ http://www.island6.org ' Co-Author...... Frank Plant ' E-mail......... plantlife@telefonica.net ' Sound Design... Lucas & Olivia Gurdjian ' E-mail......... lucas@warehousestudio.org ' WWW............ http://www.warehousestudio.org/ ' Date........... MARCH 2007 ' ' ----------[ Program Description ]---------------------------------------- ' 'A torch flashed at a square panel standing vertically on the floor, 'produces the sound of human onomatopoeias which vary depending on the area 'onto which the light is projected. Nine different grimaces are depicted on 'this photographic panel. Each facial expression becomes visible by means 'of a light box mechanism, whenever the flashlight points at it. 'A corresponding onomatopoeia is then produced by a sound sampler. 'The effect is a large human chorus conducted by the action of a flashlight. ' ' ----------[ Diagram ]---------------------------------------------------- ' ' __________ ' SER TX <-| 1 40 |-- PWR ' SER RX ->| 2 39 |-- (PWR) GND ' SER ATN ->| 3 38 |-- RESET ' SER GND --| 4 37 |-- +5V ' SENSITIVITY POT. I/O 0 ->| 5 36 |-> I/O X15 MIDI ' LEDR1 I/O 1 ->| 6 35 |-- I/O X14 N/C ' LEDR2 I/O 2 ->| 7 34 |-- I/O X13 N/C ' LEDR3 I/O 3 ->| 8 33 |-- I/O X12 N/C ' LEDR4 I/O 4 ->| 9 32 |-- I/O X11 N/C ' LEDR5 I/O 5 ->| 10 31 |-- I/O X10 N/C ' LEDR6 I/O 6 ->| 11 30 |-- I/O X9 N/C ' LEDR7 I/O 7 ->| 12 29 |-> I/O X8 RELAY9 ' LEDR8 I/O 8 ->| 13 28 |-> I/O X7 RELAY8 ' LEDR9 I/O 9 ->| 14 27 |-> I/O X6 RELAY7 ' N/C I/O 10 --| 15 26 |-> I/O X5 RELAY6 ' N/C I/O 11 --| 16 25 |-> I/O X4 RELAY5 ' N/C I/O 12 --| 17 24 |-> I/O X3 RELAY4 ' N/C I/O 13 --| 18 23 |-> I/O X2 RELAY3 ' N/C I/O 14 --| 19 22 |-> I/O X1 RELAY2 ' N/C I/O 15 --| 20 21 |-> I/O X0 RELAY1 ' |__________| ' ' BS2p40-IC ' ' ' ----------[ Variables ]-------------------------------------------------- ' Sensor_result VAR Word sensitivity VAR Word midi VAR Byte n VAR Byte 'sensitivity=700 '700 is a good starting point - smaller number is more sensitive Bass_tracking_value VAR Byte general_value VAR Word ' ----------[ Constants ]-------------------------------------------------- ' Light_Face1 CON 0 Light_Face2 CON 1 Light_Face3 CON 2 Light_Face4 CON 3 Light_Face5 CON 4 Light_Face6 CON 5 Light_Face7 CON 6 Light_Face8 CON 7 Light_Face9 CON 8 Light_Face10 CON 9 Light_Face11 CON 10 Light_Face12 CON 11 Light_Face13 CON 12 Light_Face14 CON 13 Light_Face15 CON 14 Sensitivity_Pot CON 0 Sensor_Face1 CON 1 Sensor_Face2 CON 2 Sensor_Face3 CON 3 Sensor_Face4 CON 4 Sensor_Face5 CON 5 Sensor_Face6 CON 6 Sensor_Face7 CON 7 Sensor_Face8 CON 8 Sensor_Face9 CON 9 Sensor_Face10 CON 10 Sensor_Face11 CON 11 Sensor_Face12 CON 12 Sensor_Face13 CON 13 Sensor_Face14 CON 14 Sensor_Face15 CON 15 ' ----------[ Initialization ]--------------------------------------------- 'GOTO start '****************** 'DEBUG "reset",CR '****************** general_value=1 PAUSE 1000 GOSUB AllLightsOFF GOSUB AllNotesOff PAUSE 1000 GOSUB Play_Bass ' ----------[ Main Code ]-------------------------------------------------- '****************** start: Measure_Sensitivity: MAINIO HIGH Sensitivity_Pot PAUSE 1 RCTIME Sensitivity_Pot,1,sensitivity sensitivity=sensitivity+300 'DEBUG? sensitivity 'GOTO Measure_Sensitivity Measure_Light_Face1: MAINIO HIGH Sensor_Face1 PAUSE 1 RCTIME Sensor_Face1,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face2 IF Sensor_result < sensitivity+50 THEN LightReceived_Face1 Measure_Light_Face2: MAINIO HIGH Sensor_Face2 PAUSE 1 RCTIME Sensor_Face2,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face3 IF Sensor_result < sensitivity THEN LightReceived_Face2 Measure_Light_Face3: MAINIO HIGH Sensor_Face3 PAUSE 1 RCTIME Sensor_Face3,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face4 IF Sensor_result < sensitivity+75 THEN LightReceived_Face3 Measure_Light_Face4: MAINIO HIGH Sensor_Face4 PAUSE 1 RCTIME Sensor_Face4,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face5 IF Sensor_result < sensitivity THEN LightReceived_Face4 Measure_Light_Face5: MAINIO HIGH Sensor_Face5 PAUSE 1 RCTIME Sensor_Face5,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face6 IF Sensor_result < sensitivity THEN LightReceived_Face5 Measure_Light_Face6: MAINIO HIGH Sensor_Face6 PAUSE 1 RCTIME Sensor_Face6,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face7 IF Sensor_result < sensitivity THEN LightReceived_Face6 Measure_Light_Face7: MAINIO HIGH Sensor_Face7 PAUSE 1 RCTIME Sensor_Face7,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face8 IF Sensor_result < sensitivity THEN LightReceived_Face7 Measure_Light_Face8: 'this is a loop MAINIO HIGH Sensor_Face8 PAUSE 1 RCTIME Sensor_Face8,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face9 IF Sensor_result+100 < sensitivity THEN LightReceived_Face8 '+100 is to compensate for the quantity of white in the photograph Measure_Light_Face9: 'this is a loop MAINIO HIGH Sensor_Face9 PAUSE 1 RCTIME Sensor_Face9,1,Sensor_result 'DEBUG? Sensor_result 'DEBUG "9",CR 'GOTO Measure_Light_Face10 IF Sensor_result+100 < sensitivity THEN LightReceived_Face9 '+100 is to compensate for the quantity of white in the photograph Measure_Light_Face10: 'this is a loop MAINIO HIGH Sensor_Face10 PAUSE 1 RCTIME Sensor_Face10,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face11 IF Sensor_result+100 < sensitivity THEN LightReceived_Face10 '+100 is to compensate for the quantity of white in the photograph Measure_Light_Face11: MAINIO HIGH Sensor_Face11 PAUSE 1 RCTIME Sensor_Face11,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face12 IF Sensor_result < sensitivity+100 THEN LightReceived_Face11 Measure_Light_Face12: MAINIO HIGH Sensor_Face12 PAUSE 1 RCTIME Sensor_Face12,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face13 IF Sensor_result < sensitivity THEN LightReceived_Face12 Measure_Light_Face13: MAINIO HIGH Sensor_Face13 PAUSE 1 RCTIME Sensor_Face13,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face14 IF Sensor_result < sensitivity THEN LightReceived_Face13 Measure_Light_Face14: MAINIO HIGH Sensor_Face14 PAUSE 1 RCTIME Sensor_Face14,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face15 IF Sensor_result < sensitivity THEN LightReceived_Face14 Measure_Light_Face15: MAINIO HIGH Sensor_Face15 PAUSE 1 RCTIME Sensor_Face15,1,Sensor_result 'DEBUG? Sensor_result 'GOTO Measure_Light_Face15 IF Sensor_result < sensitivity+50 THEN LightReceived_Face15 general_value=general_value+1 'DEBUG?general_value IF general_value = 1000 THEN general_value=1 GOSUB Play_Bass ENDIF GOTO Measure_Sensitivity '*************************************************************** LightReceived_Face1: midi=36 'starts at 36 AUXIO HIGH Light_Face1 GOSUB Send_Midi GOTO Measure_Light_Face1 LightReceived_Face2: midi=37 'starts at 36 AUXIO HIGH Light_Face2 GOSUB Send_Midi GOTO Measure_Light_Face2 LightReceived_Face3: midi=38 'starts at 36 AUXIO HIGH Light_Face3 GOSUB Send_Midi GOTO Measure_Light_Face3 LightReceived_Face4: midi=39 'starts at 36 AUXIO HIGH Light_Face4 GOSUB Send_Midi GOTO Measure_Light_Face4 LightReceived_Face5: midi=40 'starts at 36 AUXIO HIGH Light_Face5 GOSUB Send_Midi GOTO Measure_Light_Face5 LightReceived_Face6: midi=41 'starts at 36 AUXIO HIGH Light_Face6 GOSUB Send_Midi GOTO Measure_Light_Face6 LightReceived_Face7: midi=42 'starts at 36 AUXIO HIGH Light_Face7 GOSUB Send_Midi GOTO Measure_Light_Face7 LightReceived_Face8: midi=43 'starts at 36 AUXIO HIGH Light_Face8 GOSUB Send_Midi GOTO Measure_Light_Face8 LightReceived_Face9: midi=44 'starts at 36 AUXIO HIGH Light_Face9 GOSUB Send_Midi GOTO Measure_Light_Face9 LightReceived_Face10: midi=45 'starts at 36 AUXIO HIGH Light_Face10 GOSUB Send_Midi GOTO Measure_Light_Face10 LightReceived_Face11: midi=46 'starts at 36 AUXIO HIGH Light_Face11 GOSUB Send_Midi GOTO Measure_Light_Face11 LightReceived_Face12: midi=47 'starts at 36 AUXIO HIGH Light_Face12 GOSUB Send_Midi GOTO Measure_Light_Face12 LightReceived_Face13: midi=48 'starts at 36 AUXIO HIGH Light_Face13 GOSUB Send_Midi GOTO Measure_Light_Face13 LightReceived_Face14: midi=49 'starts at 36 AUXIO HIGH Light_Face14 GOSUB Send_Midi GOTO Measure_Light_Face14 LightReceived_Face15: midi=50 'starts at 36 AUXIO HIGH Light_Face15 GOSUB Send_Midi GOTO Measure_Light_Face15 '*********************************************************** Send_Midi: AUXIO 'debug ?midi SEROUT 15,60,0,[144,midi,127] PAUSE 300 LOW Light_Face1:LOW Light_Face2:LOW Light_Face3:LOW Light_Face4:LOW Light_Face5:LOW Light_Face6:LOW Light_Face7:LOW Light_Face8:LOW Light_Face9:LOW Light_Face10:LOW Light_Face11:LOW Light_Face12:LOW Light_Face13:LOW Light_Face14:LOW Light_Face15 PAUSE 200 Measure_Sensitivity2: MAINIO HIGH Sensitivity_Pot PAUSE 1 RCTIME Sensitivity_Pot,1,sensitivity sensitivity=sensitivity+300 'DEBUG? sensitivity RETURN '********************** subroutines********************** AllLightsON: 'check if all the bulbs work AUXIO FOR n=0 TO 14 HIGH n:PAUSE 800:LOW n NEXT RETURN AllLightsOFF: 'check if all the bulbs work AUXIO FOR n=0 TO 14 LOW n NEXT RETURN AllNotesOff: AUXIO SEROUT 15,60,0,[176,123,0] 'all notes off RETURN Play_Bass: AUXIO SEROUT 15,60,0,[144,51,127] 'all notes off RETURN