' ' Sound effect editor ' ' by Oscar Toledo G. ' http://nanochess.org/ ' ' Creation date: May/07/2021. ' ON FRAME GOSUB play_effects CONST SOUND_LENGTH = 20 CONST DEBOUNCE_TIME = 12 CONST WINDOW_HEIGHT = 8 CONST DEFAULT_FREQUENCY = 170 CONST DEFAULT_VOLUME = 12 DIM #freq(SOUND_LENGTH) DIM vol(SOUND_LENGTH) DIM noise(SOUND_LENGTH) DIM mix(SOUND_LENGTH) CLS MODE 0,1,0,0,0 WAIT PRINT AT 0 COLOR 7,"Sound effect editor" #backtab(20) = $2000 PRINT AT 21 COLOR 3,"1-Edit frequency" PRINT AT 41 COLOR 3,"2-Edit volume" PRINT AT 61 COLOR 3,"3-Edit noise" PRINT AT 81 COLOR 3,"4-Toggle noise mix" PRINT AT 101 COLOR 3,"5-Incr. length" PRINT AT 121 COLOR 3,"6-Decr. length" PRINT AT 141 COLOR 3,"7-Edit speed" PRINT AT 161 COLOR 3,"8-Toggle repeat" PRINT AT 181 COLOR 3,"9-Play" PRINT AT 201 COLOR 3,"0-Show source" PRINT AT 220 COLOR 6,"Move up&dn with disc" DO WAIT IF debounce THEN debounce = debounce - 1 c = CONT.key IF debounce THEN c = 12 LOOP WHILE c = 12 debounce = DEBOUNCE_TIME window = 0 index = 0 #freq(0) = DEFAULT_FREQUENCY vol(0) = DEFAULT_VOLUME length = 1 speed = 12 repeat = 0 debounce = 15 GOSUB show_headers ' ' Main loop ' main_loop: WAIT IF debounce THEN debounce = debounce - 1 GOSUB highlight_item PRINT AT 40 COLOR 3,"Index:",<2>index ' ' Move highlight with disc ' c = CONT d = c AND $e0 IF (d = $00) THEN c = controller_direction(c AND $1F) IF debounce THEN c = 0 IF c = 1 THEN ' Up GOSUB dehighlight_item IF index > 0 THEN index = index - 1 IF index < window THEN window = window - 1 GOSUB update_list END IF debounce = DEBOUNCE_TIME END IF IF c = 3 THEN ' Down GOSUB dehighlight_item IF index < length - 1 THEN index = index + 1 IF index >= window + WINDOW_HEIGHT THEN window = window + 1 GOSUB update_list END IF debounce = DEBOUNCE_TIME END IF END IF c = CONT.key IF debounce THEN c = 12 IF c = 1 THEN ' 1- Enter frequency debounce = DEBOUNCE_TIME GOSUB enter_frequency IF #value <> -1 THEN if #value > 4095 THEN #value = 4095 #freq(index) = #value END IF GOSUB update_item ELSEIF c = 2 THEN ' 2- Enter volume debounce = DEBOUNCE_TIME GOSUB enter_volume IF #value <> -1 THEN IF #value > 15 THEN #value = 15 vol(index) = #value END IF GOSUB update_item ELSEIF c = 3 THEN ' 3- Enter noise debounce = DEBOUNCE_TIME GOSUB enter_noise IF #value <> -1 THEN IF #value > 31 THEN #value = 31 noise(index) = #value END IF GOSUB update_item ELSEIF c = 4 THEN ' 4- Toggle mix of noise/tone debounce = DEBOUNCE_TIME mix(index) = mix(index) XOR 1 GOSUB update_item ELSEIF c = 5 THEN ' 5- Increase length of sound effect GOSUB dehighlight_item debounce = DEBOUNCE_TIME IF length < SOUND_LENGTH THEN #freq(length) = DEFAULT_FREQUENCY vol(length) = DEFAULT_VOLUME length = length + 1 END IF WAIT GOSUB update_list GOSUB show_length ELSEIF c = 6 THEN ' 6- Decrease length of sound effect GOSUB dehighlight_item debounce = DEBOUNCE_TIME IF length > 1 THEN length = length - 1 IF index >= length THEN index = length - 1 IF window >= length - WINDOW_HEIGHT THEN IF length - WINDOW_HEIGHT < 0 THEN window = 0 ELSE window = length - WINDOW_HEIGHT END IF END IF WAIT GOSUB update_list GOSUB show_length ELSEIF c = 7 THEN ' 7- Enter speed for playing (video frames for each tone) debounce = DEBOUNCE_TIME GOSUB enter_speed IF #value <> -1 THEN IF #value < 1 THEN #value = 1 IF #value > 12 THEN #value = 12 speed = #value END IF GOSUB show_speed ELSEIF c = 8 THEN ' 8- Toggle repeat when playing debounce = DEBOUNCE_TIME repeat = repeat XOR 1 GOSUB show_repeat ELSEIF c = 9 THEN ' 9- Play sound effect debounce = DEBOUNCE_TIME sound_effect = sound_effect XOR 1 sound_state = 0 ELSEIF c = 0 THEN ' 0- Show source code debounce = DEBOUNCE_TIME GOSUB show_source GOSUB show_headers END IF GOTO main_loop ' ' Show headers ' show_headers: PROCEDURE CLS MODE 0,1,0,2,0 WAIT PRINT AT 0 COLOR 7,"Sound effect editor" #backtab(20) = $2000 GOSUB show_length GOSUB show_speed GOSUB show_repeat GOSUB update_list END ' ' Show source code ' show_source: PROCEDURE CLS MODE 0,0,0,0,0 WAIT c = 0 d = 0 WHILE d < length PRINT AT c,"SOUND 2,",<>#freq(d),",",<>vol(d) c = c + 20 PRINT AT c,"SOUND 4," IF mix(d) THEN PRINT <>noise(d) PRINT ",$",<>3 - mix(d) * 2,"8" c = c + 20 d = d + 1 IF d = length THEN EXIT WHILE IF c = 200 THEN PRINT AT 200 COLOR 3,"Press key to" PRINT AT 220,"continue" DO WAIT IF debounce THEN debounce = debounce - 1 c = CONT.KEY IF debounce THEN c = 12 LOOP WHILE c = 12 debounce = DEBOUNCE_TIME END IF WEND PRINT AT 200 COLOR 3,"Press key to" PRINT AT 220,"exit" DO WAIT IF debounce THEN debounce = debounce - 1 c = CONT.KEY IF debounce THEN c = 12 LOOP WHILE c = 12 debounce = DEBOUNCE_TIME END show_length: PROCEDURE PRINT AT 50 COLOR 3,"Length:",<2>length END show_speed: PROCEDURE PRINT AT 221 COLOR 3,"Speed:",<2>speed END show_repeat: PROCEDURE PRINT AT 230 COLOR 3,"Repeat:" IF repeat THEN PRINT "Yes" ELSE PRINT "No " END enter_speed: PROCEDURE c = 227 d = 2 GOSUB read_number END enter_frequency: PROCEDURE c = (index - window) * 20 + 63 d = 4 GOSUB read_number END enter_volume: PROCEDURE c = (index - window) * 20 + 70 d = 2 GOSUB read_number END enter_noise: PROCEDURE c = (index - window) * 20 + 75 d = 2 GOSUB read_number END read_number: PROCEDURE FOR e = 0 TO d - 1 #backtab(c) = 0 NEXT e #value = 0 DO #backtab(c) = $5f * 8 + 7 DO WAIT IF debounce THEN debounce = debounce - 1 e = CONT.key IF debounce THEN e = 12 LOOP WHILE e = 12 debounce = DEBOUNCE_TIME IF e = 10 THEN #value = -1: RETURN IF e < 10 THEN #value = #value * 10 + cont.key #backtab(c) = (cont.key + 16) * 8 + 7 c = c + 1 d = d - 1 END IF LOOP WHILE d <> 0 AND cont.key <> 11 END update_item: PROCEDURE c = index d = index - window PRINT AT d * 20 + 61 COLOR 5 GOSUB update_data END update_data: PROCEDURE PRINT "T:",<4>#freq(c)," V:",<2>vol(c)," N:",<2>noise(c)," M",<1>mix(c) END update_list: PROCEDURE FOR d = 0 TO 7 c = window + d PRINT AT d * 20 + 61 COLOR 5 IF c >= length THEN PRINT " " ELSE GOSUB update_data END IF NEXT d END highlight_item: PROCEDURE c = (index - window) * 20 #backtab(60 + c) = $2000 #backtab(80 + c) = $2000 END dehighlight_item: PROCEDURE c = (index - window) * 20 #backtab(60 + c) = $0000 #backtab(80 + c) = $0000 END ' ' Convert controller direction to a 90 degree direction. ' controller_direction: DATA 0,3,2,3,1,0,2,0 DATA 4,4,0,0,1,0,0,0 DATA 0,3,2,0,0,0,0,0 DATA 4,0,0,0,1,0,0,0 ' ' Play sound effect ' play_effects: PROCEDURE ON sound_effect GOSUB sound_none, sound_user END sound_none: PROCEDURE SOUND 2,,0 SOUND 4,,$38 END sound_user: PROCEDURE sound_temp = sound_state / speed SOUND 2,#freq(sound_temp),vol(sound_temp) SOUND 4,noise(sound_temp),$38 - mix(sound_temp) * $20 sound_state = sound_state + 1 IF sound_state = length * speed THEN IF repeat THEN sound_state = 0 ELSE sound_effect = 0 END IF END IF END