An online landscape, built as a tool to explore the many aspects of the human voice.
https://voicegardens.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.6 KiB
103 lines
2.6 KiB
//
|
|
// Vocoder front-end Javascript
|
|
//
|
|
// https://learnxinyminutes.com/docs/javascript/
|
|
// https://developer.mozilla.org/en-US/docs/web/javascript/reference
|
|
//
|
|
|
|
// TODO: Read this from the environment so it can run propoerly
|
|
// depending on whether it is in development or production mode
|
|
var serverUrl = 'http://localhost:5000';
|
|
var archiveUrl = serverUrl + '/add-to-archive/';
|
|
|
|
var mic, recorder, soundFile;
|
|
var recordingTimeout = 30000; // 30 seconds (in milliseconds)
|
|
|
|
function setupRecording(){
|
|
mic = new p5.AudioIn();
|
|
mic.start();
|
|
|
|
recorder = new p5.SoundRecorder();
|
|
recorder.setInput(mic);
|
|
|
|
soundFile = new p5.SoundFile();
|
|
|
|
function doRecording(){
|
|
if (mic.enabled){
|
|
setTimeout(recorder.record(soundFile), recordingTimeout);
|
|
}
|
|
};
|
|
|
|
function doStopping(){
|
|
if (recorder.recording) {
|
|
recorder.stop();
|
|
}
|
|
};
|
|
|
|
function doPlaying(){
|
|
if (soundFile.isLoaded()){
|
|
soundFile.play();
|
|
}
|
|
};
|
|
|
|
function doArchiving(){
|
|
var soundBlob = soundFile.getBlob();
|
|
|
|
var httpRequestOptions = {
|
|
method: 'POST',
|
|
body: new FormData().append('soundBlob', soundBlob),
|
|
headers: new Headers({enctype: 'multipart/form-data'})
|
|
};
|
|
|
|
// TODO: do error handling when things fail
|
|
// TODO: this doesn't actually work right now
|
|
httpDo(archiveUrl, httpRequestOptions);
|
|
};
|
|
|
|
// TODO: we'll probably want something more glam than
|
|
// some default buttons but that's fine for experimenting
|
|
recordButton = createButton('record');
|
|
recordButton.position(10, 90);
|
|
recordButton.mousePressed(doRecording);
|
|
|
|
stopButton = createButton('stop');
|
|
stopButton.position(120, 90);
|
|
stopButton.mousePressed(doStopping);
|
|
|
|
playButton = createButton('play');
|
|
playButton.position(210, 90);
|
|
playButton.mousePressed(doPlaying);
|
|
|
|
playButton = createButton('archive');
|
|
playButton.position(300, 90);
|
|
playButton.mousePressed(doArchiving);
|
|
}
|
|
|
|
function collectSoundParamters(){
|
|
// TODO: collect all the sound parameters
|
|
// [x] amplitude
|
|
// [x] length of sound
|
|
// [ ] pitch
|
|
// [ ] nuance
|
|
// btw, there is no "nuance" function for p5js. My current guess is to
|
|
// perhaps measure it from the "getPeaks". For all wave peaks measured,
|
|
// ??? (need to think this through, not really sure ...)
|
|
amplitude = soundFile.getPeaks();
|
|
duration = soundFile.duration();
|
|
}
|
|
|
|
function generateShape(){
|
|
// TODO: take in sound parameters and generate a shape
|
|
ellipse(100, 100, 25, 25);
|
|
}
|
|
|
|
function setup(){
|
|
// TODO: Replace this with the leaflet/mappa setup just
|
|
// using this for now to draw something to experiment on
|
|
createCanvas(600, 600);
|
|
|
|
setupRecording();
|
|
}
|
|
|
|
function draw(){
|
|
}
|
|
|