@@ -1 +1,19 @@ | |||||
m i l c h l o d e | |||||
TODO: | |||||
Two or three channels | |||||
Global Sliders: | |||||
- BPM | |||||
- Input gain | |||||
- Amount of input to send to delay line | |||||
- Feedback amount | |||||
Global Switches: | |||||
- OSC Master/Minion | |||||
Channel Sliders: | |||||
- Gain | |||||
Channel buttons: | |||||
- Clear | |||||
- Mute/unmute | |||||
- Pitch down |
@@ -1,101 +1,92 @@ | |||||
main.csd | |||||
Pete Shadbolt.2014 | |||||
Based on code by Iain McCurdy, 2006 | |||||
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> | |||||
<CsOptions> | |||||
-iadc -odac -dm0 | |||||
</CsOptions> | |||||
<CsInstruments> | |||||
sr = 44100 ;Sample rate | |||||
ksmps = 4 ;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 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> | |||||
i 2 0 -1 ;Instrument 2 plays a held note | |||||
f 0 3600 ;Keep performance going | |||||
</CsScore> | |||||
</CsoundSynthesizer> | |||||
<CsoundSynthesizer> | |||||
<CsOptions> | |||||
-iadc -odac -dm0 | |||||
</CsOptions> | |||||
<CsInstruments> | |||||
; CSound parameters | |||||
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 | |||||
; Delay parameters | |||||
gkporttime init 0.3 ; Portamento time | |||||
;gkdlt init 5 ; Max delay | |||||
;gkmix init .5 ; Dry/wet | |||||
;gkfeedamt init .95 ; Feedback ratio | |||||
;gkamp init .7 ; Output amplitude rescaling | |||||
;gkingain init .5 ; Input gain | |||||
;gkOnOff init 1 ; Input on off | |||||
; 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", 0, 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 is the delay line | |||||
instr 2 | |||||
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> | |||||
i 2 0 -1 ;Instrument 2 plays a held note | |||||
f 0 3600 ;Keep performance going | |||||
</CsScore> | |||||
</CsoundSynthesizer> |
@@ -0,0 +1,53 @@ | |||||
var context = null; | |||||
// success callback when requesting audio input stream | |||||
function gotStream(stream) { | |||||
window.AudioContext = window.AudioContext || window.webkitAudioContext; | |||||
var ctx = new AudioContext(); | |||||
// Create an AudioNode from the stream. | |||||
var micSource = ctx.createMediaStreamSource(stream); | |||||
// Connect it to the destination to hear yourself (or any other node for processing!) | |||||
micSource.connect(ctx.destination); | |||||
} | |||||
document.addEventListener('DOMContentLoaded', function() { | |||||
//if (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia) | |||||
//navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; | |||||
if (!navigator.getUserMedia) navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia; | |||||
var constraints = { "audio": { "mandatory": { "googEchoCancellation": "false", "googAutoGainControl": "false", "googNoiseSuppression": "false", "googHighpassFilter": "false" }}} | |||||
navigator.getUserMedia(constraints, gotStream, function(e) { alert('Error getting audio'); console.log(e); }); | |||||
//var controls = $("div#sliders"); | |||||
//controls.find("input[name='delayTime']").on('input', function() { | |||||
//delay.delayTime.value = $(this).val(); | |||||
//}); | |||||
//controls.find("input[name='feedback']").on('input', function() { | |||||
//feedback.gain.value = $(this).val(); | |||||
//}); | |||||
//controls.find("input[name='frequency']").on('input', function() { | |||||
//filter.frequency.value = $(this).val(); | |||||
//}); | |||||
//delay = ctx.createDelay(); | |||||
//delay.delayTime.value = 0.5; | |||||
//feedback = ctx.createGain(); | |||||
//feedback.gain.value = 0.8; | |||||
//filter = ctx.createBiquadFilter(); | |||||
//filter.frequency.value = 1000; | |||||
//delay.connect(feedback); | |||||
//feedback.connect(filter); | |||||
//filter.connect(delay); | |||||
//source.connect(delay); | |||||
//source.connect(ctx.destination); | |||||
//delay.connect(ctx.destination); | |||||
}); | |||||
@@ -0,0 +1,2 @@ | |||||
body {font-family: monospace; font-size:12pt; background:url(rules.png) center center no-repeat;} | |||||
.player { color:white; background-color:black; width:200px; padding:5px; border-radius:5px; text-align:center; height:300px;} |
@@ -0,0 +1,15 @@ | |||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> | |||||
<html> | |||||
<head> | |||||
<title>Web audio test</title> | |||||
<link rel="stylesheet" type="text/css" href="css.css"> | |||||
<script type="text/javascript" src="main.js"></script> | |||||
</head> | |||||
<body> | |||||
Testing testing | |||||
</body> | |||||
</html> | |||||
@@ -0,0 +1,53 @@ | |||||
var context = null; | |||||
// success callback when requesting audio input stream | |||||
function gotStream(stream) { | |||||
window.AudioContext = window.AudioContext || window.webkitAudioContext; | |||||
var ctx = new AudioContext(); | |||||
// Create an AudioNode from the stream. | |||||
var micSource = ctx.createMediaStreamSource(stream); | |||||
// Connect it to the destination to hear yourself (or any other node for processing!) | |||||
micSource.connect(ctx.destination); | |||||
} | |||||
document.addEventListener('DOMContentLoaded', function() { | |||||
//if (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia) | |||||
//navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; | |||||
if (!navigator.getUserMedia) navigator.getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia; | |||||
var constraints = { "audio": { "mandatory": { "googEchoCancellation": "false", "googAutoGainControl": "false", "googNoiseSuppression": "false", "googHighpassFilter": "false" }}} | |||||
navigator.getUserMedia(constraints, gotStream, function(e) { alert('Error getting audio'); console.log(e); }); | |||||
//var controls = $("div#sliders"); | |||||
//controls.find("input[name='delayTime']").on('input', function() { | |||||
//delay.delayTime.value = $(this).val(); | |||||
//}); | |||||
//controls.find("input[name='feedback']").on('input', function() { | |||||
//feedback.gain.value = $(this).val(); | |||||
//}); | |||||
//controls.find("input[name='frequency']").on('input', function() { | |||||
//filter.frequency.value = $(this).val(); | |||||
//}); | |||||
//delay = ctx.createDelay(); | |||||
//delay.delayTime.value = 0.5; | |||||
//feedback = ctx.createGain(); | |||||
//feedback.gain.value = 0.8; | |||||
//filter = ctx.createBiquadFilter(); | |||||
//filter.frequency.value = 1000; | |||||
//delay.connect(feedback); | |||||
//feedback.connect(filter); | |||||
//filter.connect(delay); | |||||
//source.connect(delay); | |||||
//source.connect(ctx.destination); | |||||
//delay.connect(ctx.destination); | |||||
}); | |||||