xxxxxxxxxx
250
var lsys;
var letterIndex = 0;
var sentence = "";
var rad = 2;
let isPlaying = false;
var m = 400;
// if you make this lower than 1000, the dots respond more (visually) to the L system!
var delay_factor = 1.0;
const dist = new Tone.Distortion(0);
const reverb = new Tone.JCReverb({
wet: 0.7
});
const outputNode = new Tone.Gain(0.9).chain(dist, Tone.Master);
const oscillators = [new Tone.Oscillator(110).connect(outputNode)];
const grainPlayer = new Tone.GrainPlayer({
url: "newrecording.mp3",
loopStart: 1,
loopEnd: 2,
overlap: 0.5,
grainSize: 2,
loop: true,
playbackRate: 1,
debug: true,
detune: -2000,
});
const grainPlayer2 = new Tone.GrainPlayer({
url: "newrecording.mp3",
loopStart: 15,
loopEnd: 16,
overlap: 0.5,
grainSize: 2,
loop: true,
playbackRate: 1,
debug: true,
detune: -1500,
});
// grainPlayer.loop.value = true;
grainPlayer.chain(new Tone.Panner(-1), reverb, outputNode);
grainPlayer2.chain(new Tone.Panner(1), reverb, outputNode);
const sampler = new Tone.Sampler({
"A1": "newrecording.mp3"
})
// sampler.chain(reverb, outputNode);
const looper = new Tone.Loop((time) => {
console.log(time)
sampler.triggerAttackRelease("A1", time, 0.1)
sampler.triggerAttackRelease("A0", time, 0.1)
}, 1)
looper.start(0)
let radSlider1
let radSlider2
let speedSlider1
let speedSlider2
function x1(t, letter) {
return 0.25 * width + radSlider1.value() * cos(speedSlider1.value() / 100 * TWO_PI * t);
};
function y1(t, letter) {
return 0.5 * height + radSlider1.value() * sin(speedSlider1.value() / 100 * TWO_PI * t);
};
function x2(t, letter) {
return 0.75 * width + radSlider2.value() * cos(speedSlider2.value() / 100 * TWO_PI * t);
};
function y2(t, letter) {
return 0.5 * height + radSlider2.value() * sin(speedSlider2.value() / 100 * TWO_PI * t);
};
function setup() {
createCanvas(windowWidth, windowHeight, WEBGL);
background(0);
var ruleset = [];
// Fill with two rules
ruleset[0] = new Rule("F", "F--F--F--G");
ruleset[1] = new Rule("G", "GG");
// Create LSystem with axiom and ruleset
lsys = new LSystem("F--G--F", ruleset);
lsys.generate();
lsys.generate();
lsys.generate();
sentence = lsys.getSentence();
var posX = 0;
var posY = 0;
radSlider1 = createSlider(0, 100).input(function() {
grainPlayer.set({
volume: this.value() / 2 - 50
})
})
radSlider2 = createSlider(0, 100).input(function() {
grainPlayer2.set({
volume: this.value() / 2 - 50
})
})
speedSlider1 = createSlider(1, 200).input(function() {
grainPlayer.set({
detune: this.value() * 50 - 8000
})
})
speedSlider2 = createSlider(1, 200).input(function() {
grainPlayer2.set({
detune: this.value() * 50 - 8000
})
})
noLoop()
}
function draw() {
background(0, 10);
translate(-windowWidth / 2, -windowHeight / 2, 0)
const t = (1.0 * (frameCount - 1)) / 100;
const letter = sentence[letterIndex];
console.log(letterIndex);
stroke(255);
fill(255);
beginShape();
if (letter === "F") {
delay_factor += 0.1;
}
if (letter === "-") {
// delay_factor -= 0.1;
// oscillators[0].frequency.value -=0.5;
// oscillators[1].frequency.value +=0.02;
// grainPlayer.set({detune: grainPlayer.detune * Math.random() > 0.5 ? 0.5 : 2})
// grainPlayer2.set({detune: grainPlayer2.detune - 3})
// grainPlayer.set({
// loopStart: grainPlayer.loopStart + 0.1
// });
// grainPlayer.set({
// loopEnd: grainPlayer.loopEnd + 0.1
// });
}
if (letter === "G") {
delay_factor -= 0.1;
}
for (var i = 0; i <= m; i++) {
var tt = 1.0 * i / m;
var x = lerp(x1(t - delay_factor * tt), x2(t - delay_factor * (1 - tt)), tt);
var y = lerp(y1(t - delay_factor * tt), y2(t - delay_factor * (1 - tt)), tt);
ellipse(x, y, rad, rad);
endShape();
}
// fill(255,0,0);
// var xEnd = lerp(x1(t), x2(t), tt);
// var yEnd = lerp(y1(t), y2(t), tt);
// ellipse(xEnd, yEnd, 10, 10);
// ellipse(xEnd, yEnd, 10, 10);
// var xStart = lerp(x1(t), x2(t), 0);
// var yStart = lerp(y1(t), y2(t), 0);
// ellipse(xStart, yStart, 10, 10);
// ellipse(xStart, yStart, 10, 10);
// // oscillators[0].frequency.value = radSlider1.value() * 2;
// // oscillators[1].frequency.value = radSlider2.value() * 2;
if (frameCount % 30 === 0) {
letterIndex++;
letterIndex = letterIndex % sentence.length;
const nextLetter = sentence[letterIndex];
if (nextLetter === "F") {
console.log("looper.playbackRate");
console.log(looper.playbackRate);
grainPlayer.set({
grainSize: grainPlayer.grainSize * 0.9
});
grainPlayer2.set({
grainSize: grainPlayer2.grainSize * 0.9
});
// console.log(dist.distortion)
grainPlayer.set({
detune: grainPlayer.detune + 100
})
grainPlayer2.set({
detune: grainPlayer2.detune + 100
})
// dist.distortion.rampTo(1, 0.3);
// console.log(looper.playbackRate)
}
if (nextLetter === "G") {
looper.set({
playbackRate: looper.playbackRate - 0.5
});
grainPlayer.set({
grainSize: grainPlayer.grainSize * 1.1
});
// grainPlayer2.grainSize.linearRampToValueAtTime(grainPlayer2.grainSize * 1.1, Tone.now() + 0.5)
grainPlayer2.set({
grainSize: grainPlayer2.grainSize * 1.1
});
grainPlayer.set({
detune: grainPlayer.detune - 100
})
grainPlayer2.set({
detune: grainPlayer2.detune - 100
})
}
}
}
function keyPressed() {
if (key === " ") {
Tone.Transport.toggle();
if (isPlaying) {
grainPlayer.stop();
grainPlayer2.stop();
oscillators.forEach(osc => {
osc.stop()
})
noLoop()
} else {
grainPlayer.start();
grainPlayer2.start();
// oscillators.forEach(osc => {
// osc.start()
// })
loop()
}
isPlaying = !isPlaying;
}
}
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
background(0);
}