|
|
@@ -1,11 +1,8 @@ |
|
|
|
main.csd
|
|
|
|
Pete Shadbolt.2014
|
|
|
|
Based on code by Iain McCurdy, 2006
|
|
|
|
|
|
|
|
THE delay OPCODE IS PLACED IN A SEPARATE, ALWAYS ON, INSTRUMENT FROM THE SOURCE SOUND PRODUCING INSTRUMENT.
|
|
|
|
THE IS A COMMONLY USED TECHNIQUE WITH TIME SMEARING OPCODES AND EFFECTS LIKE REVERBS AND DELAYS.
|
|
|
|
|
|
|
|
ksmps MAY NEED TO BE LOW (AND kr THEREFORE HIGH) WHEN WORKING WITH SHORT DELAY TIMES DEFINED INITIALLY AT KRATE
|
|
|
|
TODO: implement octave down/up (like old delay pedal), key control, panic button
|
|
|
|
|
|
|
|
<CsoundSynthesizer>
|
|
|
|
|
|
|
@@ -15,99 +12,90 @@ ksmps MAY NEED TO BE LOW (AND kr THEREFORE HIGH) WHEN WORKING WITH SHORT DELAY T |
|
|
|
|
|
|
|
<CsInstruments>
|
|
|
|
|
|
|
|
sr = 44100 ;SAMPLE RATE
|
|
|
|
ksmps = 4 ;NUMBER OF AUDIO SAMPLES IN EACH CONTROL CYCLE (MAY NEED TO BE LOW WHEN WORKING WITH SHORT DELAY TIMES DEFINED INITIALLY AT KRATE)
|
|
|
|
nchnls = 2 ;NUMBER OF CHANNELS (2=STEREO)
|
|
|
|
0dbfs = 1 ;MAXIMUM AMPLITUDE
|
|
|
|
|
|
|
|
;FLTK INTERFACE CODE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
FLcolor 255, 255, 255, 0, 0, 0
|
|
|
|
; LABEL | WIDTH | HEIGHT | X | Y
|
|
|
|
FLpanel "M I L C H L O D E", 500, 300, 0, 0
|
|
|
|
|
|
|
|
; ON | OFF | TYPE | WIDTH | HEIGHT | X | Y | OPCODE | INS | STARTTIM | DUR
|
|
|
|
gkOnOff,ihOnOff FLbutton "Input On/Off", 1, 0, 22, 180, 25, 5, 5, 0, 1, 0, -1
|
|
|
|
FLsetColor2 255, 255, 50, ihOnOff ;SET SECONDARY COLOUR TO YELLOW
|
|
|
|
|
|
|
|
;GENERAL_TEXT_SETTINGS SIZE | FONT | ALIGN | RED | GREEN | BLUE
|
|
|
|
FLlabel 13, 1, 3, 255, 255, 255 ;LABELS MADE INVISIBLE (I.E. SAME COLOR AS PANEL)
|
|
|
|
|
|
|
|
;BUTTON BANKS TYPE | NUMX | NUMY | WIDTH | HEIGHT | X | Y | OPCODE | INS | STARTTIM | DUR
|
|
|
|
;gkinput, ihinput FLbutBank 14, 1, 2, 18, 40, 250, 0, -1
|
|
|
|
|
|
|
|
;GENERAL_TEXT_SETTINGS SIZE | FONT | ALIGN | RED | GREEN | BLUE
|
|
|
|
FLlabel 13, 1, 3, 0, 0, 0 ;LABELS MADE VISIBLE AGAIN
|
|
|
|
|
|
|
|
;VALUE_DISPLAY_BOXES WIDTH | HEIGHT | X | Y
|
|
|
|
iddlt FLvalue " ", 80, 20, 5, 75
|
|
|
|
idmix FLvalue " ", 80, 20, 5, 125
|
|
|
|
idfeedbackamt FLvalue " ", 80, 20, 5, 175
|
|
|
|
idamp FLvalue " ", 80, 20, 5, 225
|
|
|
|
idporttime FLvalue " ", 80, 20, 5, 275
|
|
|
|
|
|
|
|
;SLIDERS MIN | MAX | EXP | TYPE | DISP | WIDTH | HEIGHT | X | Y
|
|
|
|
gkdlt,ihdlt FLslider "Delay Time (sec)", .001, 5, -1, 23, iddlt, 490, 25, 5, 50
|
|
|
|
gkmix,ihmix FLslider "Dry/Wet Mix", 0, 1, 0, 23, idmix, 490, 25, 5, 100
|
|
|
|
gkfeedamt,ihfeedamt FLslider "Feedback Ratio", -1, 1, 0, 23, idfeedbackamt, 490, 25, 5, 150
|
|
|
|
gkamp,ihamp FLslider "Output Amplitude Rescaling", 0, 1, 0, 23, idamp, 490, 25, 5, 200
|
|
|
|
gkporttime,ihporttime FLslider "Portamento Time", 0, 2, 0, 23, idporttime, 490, 25, 5, 250
|
|
|
|
gkingain,ihingain FLslider "Live Input Gain", 0, 1, 0, 23, -1, 140, 20, 350, 5
|
|
|
|
|
|
|
|
;SET_INITIAL_VALUES VALUE | HANDLE
|
|
|
|
FLsetVal_i 1, ihOnOff
|
|
|
|
FLsetVal_i .5, ihingain
|
|
|
|
FLsetVal_i .5, ihdlt
|
|
|
|
FLsetVal_i 0.5, ihmix
|
|
|
|
FLsetVal_i 0.7, ihfeedamt
|
|
|
|
FLsetVal_i .7, ihamp
|
|
|
|
FLsetVal_i 0.3, ihporttime
|
|
|
|
|
|
|
|
FLpanel_end ;END OF PANEL CONTENTS
|
|
|
|
|
|
|
|
|
|
|
|
FLrun ;RUN THE FLTK WIDGET THREAD
|
|
|
|
;END OF FLTK INTERFACE CODE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
|
|
instr 1 ;PLAYS FILE
|
|
|
|
if gkOnOff=0 then ;SENSE FLTK ON/OFF SWITCH
|
|
|
|
turnoff ;TURN THIS INSTRUMENT OFF IMMEDIATELY
|
|
|
|
endif
|
|
|
|
|
|
|
|
asigL, asigR ins ;TAKE INPUT FROM COMPUTER'S AUDIO INPUT
|
|
|
|
gasigL = asigL * gkingain ;SCALE USING 'Input Gain' SLIDER
|
|
|
|
gasigR = asigR * gkingain ;SCALE USING 'Input Gain' SLIDER
|
|
|
|
sr = 44100 ;Sample rate
|
|
|
|
ksmps = 20 ;Number of audio samples in each control cycle
|
|
|
|
nchnls = 2 ;Number of channels (2=stereo)
|
|
|
|
0dbfs = 1 ;Maximum amplitude
|
|
|
|
gkporttime = 0.3; portamento time
|
|
|
|
|
|
|
|
;FLTK GUI interface
|
|
|
|
FLcolor 200, 200, 255, 0, 0, 0
|
|
|
|
FLpanel "M I L C H L O D E", 500, 300, 0, 0, 0, 1
|
|
|
|
gkOnOff,ihOnOff FLbutton "Input On/Off", 1, 0, 22, 180, 25, 5, 5, 0, 1, 0, -1
|
|
|
|
|
|
|
|
; Sliders
|
|
|
|
gkdlt,ihdlt FLslider "Delay Time (sec)", .001, 5, 0, 23, -1, 490, 25, 5, 50
|
|
|
|
gkmix,ihmix FLslider "Dry/Wet Mix", 0, 1, 0, 23, -1, 490, 25, 5, 100
|
|
|
|
gkfeedamt,ihfeedamt FLslider "Feedback Ratio", -1, 1, 0, 23, -1, 490, 25, 5, 150
|
|
|
|
gkamp,ihamp FLslider "Output Amplitude Rescaling", 0, 1, 0, 23, -1, 490, 25, 5, 200
|
|
|
|
gkingain,ihingain FLslider "Input Gain", 0, 1, 0, 23, -1, 140, 20, 350, 5
|
|
|
|
ih FLbox "Keys: ", 1, 5, 14, 490, 20, 0, 250
|
|
|
|
|
|
|
|
;Set defaults
|
|
|
|
FLsetVal_i 1, ihOnOff
|
|
|
|
FLsetVal_i .5, ihingain
|
|
|
|
FLsetVal_i 4, ihdlt
|
|
|
|
FLsetVal_i 0.5, ihmix
|
|
|
|
FLsetVal_i 0.95, ihfeedamt
|
|
|
|
FLsetVal_i .7, ihamp
|
|
|
|
|
|
|
|
FLpanel_end ;End of GUI
|
|
|
|
FLrun ;Run the FLTK thread
|
|
|
|
|
|
|
|
; Instr 1 is the source
|
|
|
|
instr 1
|
|
|
|
|
|
|
|
; Turn off with the switch
|
|
|
|
if gkOnOff=0 then
|
|
|
|
turnoff
|
|
|
|
endif
|
|
|
|
|
|
|
|
; Get input from mic/line
|
|
|
|
asigL, asigR ins
|
|
|
|
gasigL = asigL * gkingain
|
|
|
|
gasigR = asigR * gkingain
|
|
|
|
endin
|
|
|
|
|
|
|
|
instr 2 ;DELAY INSTRUMENT
|
|
|
|
kporttime linseg 0, .001, 1, 1, 1 ;USE OF AN ENVELOPE VALUE THAT QUICKLY RAMPS UP FROM ZERO TO 1. THIS PREVENTS VARIABLES GLIDING TO THEIR REQUIRED VALUES EACH TIME THE INSTRUMENT IS STARTED.
|
|
|
|
kporttime = kporttime * gkporttime ;SCALE PORTAMENTO FUNCTION WITH FLTK SLIDER VALUE
|
|
|
|
kdlt portk gkdlt, kporttime ;PORTAMENTO IS APPLIED TO THE VARIABLE 'gkdlt'. A NEW VARIABLE 'kdlt' IS CREATED.
|
|
|
|
adlt interp kdlt ;A NEW A-RATE VARIABLE 'adlt' IS CREATED BY INTERPOLATING THE K-RATE VARIABLE 'kdlt'
|
|
|
|
|
|
|
|
;;;LEFT CHANNEL DELAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
abufferL delayr 5 ;CREATE A DELAY BUFFER OF 5 SECONDS DURATION (EQUIVALENT TO THE MAXIMUM DELAY TIME POSSIBLE USING THIS EXAMPLE)
|
|
|
|
adelsigL deltap3 adlt ;TAP THE DELAY LINE AT gkdlt SECONDS
|
|
|
|
delayw gasigL + (adelsigL * gkfeedamt) ;WRITE AUDIO SOURCE AND FEEDBACK SIGNAL INTO THE BEGINNING OF THE BUFFER
|
|
|
|
|
|
|
|
;;;RIGHT CHANNEL DELAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
abufferR delayr 5 ;CREATE A DELAY BUFFER OF 5 SECONDS DURATION (EQUIVALENT TO THE MAXIMUM DELAY TIME POSSIBLE USING THIS EXAMPLE)
|
|
|
|
adelsigR deltap3 adlt ;TAP THE DELAY LINE AT gkdlt SECONDS
|
|
|
|
delayw gasigR + (adelsigR * gkfeedamt) ;WRITE AUDIO SOURCE AND FEEDBACK SIGNAL INTO THE BEGINNING OF THE BUFFER
|
|
|
|
|
|
|
|
aL ntrpol gasigL, adelsigL, gkmix
|
|
|
|
aR ntrpol gasigR, adelsigR, gkmix
|
|
|
|
|
|
|
|
outs aL * gkamp, aR * gkamp ;CREATE A MIX BETWEEN THE WET AND THE DRY SIGNALS AT THE OUTPUT
|
|
|
|
clear gasigL, gasigR ;CLEAR THE GLOBAL AUDIO SEND VARIABLES
|
|
|
|
; Instr 2 is the delay line
|
|
|
|
instr 2
|
|
|
|
|
|
|
|
; Sense keyboard
|
|
|
|
kKey FLkeyIn
|
|
|
|
kChanged changed kKey
|
|
|
|
printk2 kKey
|
|
|
|
;if kKey=112&&kChanged=1 then
|
|
|
|
;printf_i "awd"
|
|
|
|
;FLsetVal_i 0.0, gkfeedamt
|
|
|
|
;endif
|
|
|
|
|
|
|
|
kporttime linseg 0, .001, 1, 1, 1 ;A short envelope
|
|
|
|
kporttime = kporttime * gkporttime ;TODO: remove this
|
|
|
|
kdlt portk gkdlt, kporttime ;Apply portamento
|
|
|
|
adlt interp kdlt ;Interpolate
|
|
|
|
|
|
|
|
;Left channel
|
|
|
|
abufferL delayr 5 ;Buffer
|
|
|
|
adelsigL deltap3 adlt ;Tap
|
|
|
|
delayw gasigL + (adelsigL * gkfeedamt) ;Feedback
|
|
|
|
|
|
|
|
;Right channel
|
|
|
|
abufferR delayr 5 ;Buffer
|
|
|
|
adelsigR deltap3 adlt ;Tap
|
|
|
|
delayw gasigR + (adelsigR * gkfeedamt) ;Feedback
|
|
|
|
|
|
|
|
aL ntrpol gasigL, adelsigL, gkmix
|
|
|
|
aR ntrpol gasigR, adelsigR, gkmix
|
|
|
|
|
|
|
|
outs aL * gkamp, aR * gkamp ;Mix wet/dry
|
|
|
|
clear gasigL, gasigR ;Clear global audio sends
|
|
|
|
endin
|
|
|
|
|
|
|
|
</CsInstruments>
|
|
|
|
|
|
|
|
<CsScore>
|
|
|
|
;INSTR | START | DURATION
|
|
|
|
i 2 0 -1 ;INSTRUMENT 2 (DELAY INSTRUMENT) PLAYS A HELD NOTE
|
|
|
|
i 2 0 -1 ;Instrument 2 plays a held note
|
|
|
|
|
|
|
|
f 0 3600 ;'DUMMY' SCORE EVENT KEEPS REALTIME PERFORMANCE GOING FOR 1 HOUR
|
|
|
|
f 0 3600 ;Keep performance going
|
|
|
|
</CsScore>
|
|
|
|
|
|
|
|
</CsoundSynthesizer>
|