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.
 
 
 
 
 
 

110 lines
2.8 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)
var shouldGenerateNewShape = false
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()
shouldGenerateNewShape = true
}
}
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(){
if (shouldGenerateNewShape){
collectSoundParamters()
generateShape()
shouldGenerateNewShape = false
}
}