JavaScript utility to chop an audio buffer, inspired from youpy/scissor
Ciseaux - JavaScript utility to chop an audio buffer : online examples
bower:
bower install ciseaux
npm:
npm install ciseaux
downloads:
Ciseaux.from(src: ArrayBuffer|string, [audioContext: AudioContext]): Promise<Tape>
Ciseaux.silence(duration: number): Tape
Ciseaux.concat(...tapes: Tape): Tape
Ciseaux.mix(...tapes: Tape, [method='silence']): Tape
constructor(audioBuffer: AudioBuffer)
sampleRate: number
readonlylength: number
readonlyduration: number
readonlynumberOfChannels
readonlynumberOfTracks
readonly
gain(gain: number = 1): Tape
pan(pan: number = 0): Tape
reverse(): Tape
pitch(rate: number = 1): Tape
stretch(rate: number = 1): Tape
- not implemented (Pull Request please)
concat(...tapes: Tape): Tape
slice(startTime: number = 0, duration: number = inf): Tape
loop(n: number = 2): Tape
fill(duration: number): Tape
replace(startTime: number = 0, duration: number = 0, tape: Tape = null): Tape
split(n: number = 2): Tape[]
mix(...tapes: Tape, [method = 'silence']): Tape
render(audioContext: AudioContext): Promise<AudioBuffer>
dispose(): void
Utility class for creating a sequence tape that is concatenated tapes
constructor(...args: any)
pattern: string
durationPerStep: number|number[]
instruments: object
apply(...args: any): Tape
pattern: string
durationPerStep: number|number[]
instruments: object
tape = new Ciseaux.Tape(audioBuffer);
tape = Ciseaux.concat([ tape.slice(10, 1), tape.slice(2, 3) ]).loop(4);
tape.render(audioContext).then(function(audioBuffer) {
var bufSrc = audioContext.createBuffer();
bufSrc.buffer = audioBuffer;
bufSrc.start(audioContext.currentTime);
bufSrc.connect();
});
tape = tape2.slice(0, 1.5).concat(tape3.slice(0, 0.5), tape1.slice(-2));
tape = tape3.slice(0, 0.5).concat(Ciseaux.silence(0.5)).loop(4);
tape = tape1.replace(2, 3, function(tape) {
return tape.reverse();
});
tape = Ciseaux.concat(tape1.split(25).map(function(tape, i) {
return tape.gain(i / 25);
}));
tape = Ciseaux.concat(tape1.split(25).map(function(tape, i) {
return tape.pan(i % 2 ? -0.85 : +0.85);
}));
tape = Ciseaux.concat(tape1.split(25).map(function(tape, i) {
return tape.pitch(i / 50 + 0.75);
}));
tape = tape1.mix(tape2.gain(0.5), "fill").fill(30);
tape = Ciseaux.concat(tape2.split(16).map(function(tape) {
return tape.loop(4).pitch(1.5);
})).fill(30);
tape = Ciseaux.mix([ 1, 0.95 ].map(function(rate) {
return tape2.pitch(rate).fill(30);
}));
tape = Ciseaux.concat(tape1.split(32).map(function(tape, index) {
return index % 2 ? tape2.pitch(2).fill(tape.duration) : tape;
})).fill(30);
tape = Ciseaux.mix([ -12, -10, -7, -3, 0 ].map(function(midi) {
return tape1.pitch(Math.pow(2, midi * 1/12));
}), "fill").gain(0.5).fill(30);
tape = new Ciseaux.Sequence("a bdacbba babfeg", 0.2, {
a: tape1.split(16)[0],
b: tape1.split(16)[1],
c: tape1.split(16)[2],
d: tape1.split(16)[3].gain(0.15),
e: tape2.split(16)[4].pitch(0.25),
f: tape2.split(16)[5].pitch(4).gain(0.1),
g: tape3.pitch(32),
}).apply().fill(30);
tape = new Ciseaux.Sequence("a bdaabcaccbgabb", {
a: tape1.split(16)[4],
b: tape1.split(16)[1],
c: tape1.split(16)[2],
d: tape1.split(16)[3].gain(0.15),
e: tape2.split(16)[4].pitch(0.25),
f: tape2.split(16)[5].pitch(4).gain(0.1),
g: tape3.pitch(32),
}).apply([ 2/3, 1/3 ].map(function(x) { return x * 0.3; })).fill(30);
# Build : babel -> browserify -> uglify-js
npm run build
# Test : mocha + power-assert
npm run test
# Coverage : mocha + isparta
npm run cover
# Lint : jshint
npm run lint
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request :D