diff --git a/index.php b/index.php index bf1d4e3..3998fb4 100644 --- a/index.php +++ b/index.php @@ -1,17 +1,20 @@ + + -

woman-in-the-middle-attack

+

woman-in-the-middle-attack

...a space for Angeliki Diakrousi to unpack

-
  • - About -
    WHAT?
    +
    You can send me a message here angeliki@conversations.im
    + + + + + +
  • + About
    WHAT?
  • - Let' s Talk About Unspeakable Things -
    THESIS, ANNOTATIONS
    + Let' s Talk About Unspeakable Things
    THESIS, ANNOTATIONS
    +
  • - Amplification of female voices -
    VOCAL EXERCISES, MEETINGS
    + Amplification of female voices
    VOCAL EXERCISES, MEETINGS
  • - Diary of West Rotterdam -
    PROCESS, ARCHIVE
    + Diary of West Rotterdam
    PROCESS, ARCHIVE
    +
  • - Feedback Composition -
    SOUNDWALKS, ANNOTATIVE RECORDINGS
    + Feedback Composition
    SOUNDWALKS, ANNOTATIVE RECORDINGS
    +
  • + + + + diff --git a/index.php.save b/index.php.save new file mode 100644 index 0000000..3fc6c16 --- /dev/null +++ b/index.php.save @@ -0,0 +1,190 @@ + + + + + +

    woman-in-the-middle-attack

    +

    ...a space for Angeliki Diakrousi to unpack

    + + + + +
    + warming up @Leeszaal +
    +
    + singing vowels @Leeszaal +
    +
    + describing/annotating +
    +
    + discussing about voice in public @Fine Arts +
    +
    + transcribing vowels @Leeszaal +
    +
    + singing vowels @Fine Arts +
    +
    + city sounds +
    +
    + describing/annotating +
    +
    + singing vowels (high) @Fine Arts +
    +
    + describing/annotating +
    + + +
    + discussing about voice in public @Leeszaal +
    +
    + warming up @Fine Arts +
    +
    + transcribing vowels @Fine Arts +
    + + + + + + + + + + + + + + + + +
    latest episode
    +"; +?> + +
    You can send me a message here angeliki@conversations.im
    + + + + + diff --git a/project/scripts/pydub.py b/project/scripts/pydub.py new file mode 100644 index 0000000..125b4e2 --- /dev/null +++ b/project/scripts/pydub.py @@ -0,0 +1,8 @@ +from pydub import AudioSegment +from pydub.utils import mediainfo + +print (mediainfo("podcasts/3_podcast.mp3")) + +# sound= AudioSegment.from_file("podcasts/3_podcast.mp3", format="mp3") +# file=sound.export("out.mp3", tags={"podcaster":"lain"}) +# print (mediainfo("out.mp3")) diff --git a/recorder.js b/recorder.js new file mode 100644 index 0000000..0cfc4a7 --- /dev/null +++ b/recorder.js @@ -0,0 +1,221 @@ +(function(window){ + + var WORKER_PATH = 'recorderWorker.js'; + var Recorder = function(source, cfg){ + var config = cfg || {}; + var bufferLen = config.bufferLen || 4096; + this.context = source.context; + this.node = this.context.createScriptProcessor(bufferLen, 2, 2); + var worker = new Worker(config.workerPath || WORKER_PATH); + worker.postMessage({ + command: 'init', + config: { + sampleRate: this.context.sampleRate + } + }); + var recording = false, + currCallback; + + this.node.onaudioprocess = function(e){ + if (!recording) return; + worker.postMessage({ + command: 'record', + buffer: [ + e.inputBuffer.getChannelData(0), + e.inputBuffer.getChannelData(1) + ] + }); + } + + this.configure = function(cfg){ + for (var prop in cfg){ + if (cfg.hasOwnProperty(prop)){ + config[prop] = cfg[prop]; + } + } + } + + this.record = function(){ + + recording = true; + } + + this.stop = function(){ + + recording = false; + } + + this.clear = function(){ + worker.postMessage({ command: 'clear' }); + } + + this.getBuffer = function(cb) { + currCallback = cb || config.callback; + worker.postMessage({ command: 'getBuffer' }) + } + + this.exportWAV = function(cb, type){ + currCallback = cb || config.callback; + type = type || config.type || 'audio/wav'; + if (!currCallback) throw new Error('Callback not set'); + worker.postMessage({ + command: 'exportWAV', + type: type + }); + } + + worker.onmessage = function(e){ + var blob = e.data; + currCallback(blob); + } + + source.connect(this.node); + this.node.connect(this.context.destination); //this should not be necessary + }; + + Recorder.forceDownload = function(blob, filename){ + var url = (window.URL || window.webkitURL).createObjectURL(blob); + var link = window.document.createElement('a'); + link.href = url; + link.download = filename || 'output.wav'; + var click = document.createEvent("Event"); + click.initEvent("click", true, true); + link.dispatchEvent(click); + } + + window.Recorder = Recorder; + + })(window); + + //ADDITIONAL JS recorderWorker.js + var recLength = 0, + recBuffersL = [], + recBuffersR = [], + sampleRate; + this.onmessage = function(e){ + switch(e.data.command){ + case 'init': + init(e.data.config); + break; + case 'record': + record(e.data.buffer); + break; + case 'exportWAV': + exportWAV(e.data.type); + break; + case 'getBuffer': + getBuffer(); + break; + case 'clear': + clear(); + break; + } + }; + + function init(config){ + sampleRate = config.sampleRate; + } + + function record(inputBuffer){ + + recBuffersL.push(inputBuffer[0]); + recBuffersR.push(inputBuffer[1]); + recLength += inputBuffer[0].length; + } + + function exportWAV(type){ + var bufferL = mergeBuffers(recBuffersL, recLength); + var bufferR = mergeBuffers(recBuffersR, recLength); + var interleaved = interleave(bufferL, bufferR); + var dataview = encodeWAV(interleaved); + var audioBlob = new Blob([dataview], { type: type }); + + this.postMessage(audioBlob); + } + + function getBuffer() { + var buffers = []; + buffers.push( mergeBuffers(recBuffersL, recLength) ); + buffers.push( mergeBuffers(recBuffersR, recLength) ); + this.postMessage(buffers); + } + + function clear(){ + recLength = 0; + recBuffersL = []; + recBuffersR = []; + } + + function mergeBuffers(recBuffers, recLength){ + var result = new Float32Array(recLength); + var offset = 0; + for (var i = 0; i < recBuffers.length; i++){ + result.set(recBuffers[i], offset); + offset += recBuffers[i].length; + } + return result; + } + + function interleave(inputL, inputR){ + var length = inputL.length + inputR.length; + var result = new Float32Array(length); + + var index = 0, + inputIndex = 0; + + while (index < length){ + result[index++] = inputL[inputIndex]; + result[index++] = inputR[inputIndex]; + inputIndex++; + } + return result; + } + + function floatTo16BitPCM(output, offset, input){ + for (var i = 0; i < input.length; i++, offset+=2){ + var s = Math.max(-1, Math.min(1, input[i])); + output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); + } + } + + function writeString(view, offset, string){ + for (var i = 0; i < string.length; i++){ + view.setUint8(offset + i, string.charCodeAt(i)); + } + } + + function encodeWAV(samples){ + var buffer = new ArrayBuffer(44 + samples.length * 2); + var view = new DataView(buffer); + + /* RIFF identifier */ + writeString(view, 0, 'RIFF'); + /* file length */ + view.setUint32(4, 32 + samples.length * 2, true); + /* RIFF type */ + writeString(view, 8, 'WAVE'); + /* format chunk identifier */ + writeString(view, 12, 'fmt '); + /* format chunk length */ + view.setUint32(16, 16, true); + /* sample format (raw) */ + view.setUint16(20, 1, true); + /* channel count */ + view.setUint16(22, 2, true); + /* sample rate */ + view.setUint32(24, sampleRate, true); + /* byte rate (sample rate * block align) */ + view.setUint32(28, sampleRate * 4, true); + /* block align (channel count * bytes per sample) */ + view.setUint16(32, 4, true); + /* bits per sample */ + view.setUint16(34, 16, true); + /* data chunk identifier */ + writeString(view, 36, 'data'); + /* data chunk length */ + view.setUint32(40, samples.length * 2, true); + + floatTo16BitPCM(view, 44, samples); + + return view; + } \ No newline at end of file diff --git a/recorderWorker.js b/recorderWorker.js new file mode 100644 index 0000000..af3bda4 --- /dev/null +++ b/recorderWorker.js @@ -0,0 +1,161 @@ +/*License (MIT) + +Copyright © 2013 Matt Diamond + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of +the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO +THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +var recLength = 0, + recBuffersL = [], + recBuffersR = [], + sampleRate; + +this.onmessage = function(e){ + switch(e.data.command){ + case 'init': + init(e.data.config); + break; + case 'record': + record(e.data.buffer); + break; + case 'exportWAV': + exportWAV(e.data.type); + break; + case 'exportMonoWAV': + exportMonoWAV(e.data.type); + break; + case 'getBuffers': + getBuffers(); + break; + case 'clear': + clear(); + break; + } +}; + +function init(config){ + sampleRate = config.sampleRate; +} + +function record(inputBuffer){ + recBuffersL.push(inputBuffer[0]); + recBuffersR.push(inputBuffer[1]); + recLength += inputBuffer[0].length; +} + +function exportWAV(type){ + var bufferL = mergeBuffers(recBuffersL, recLength); + var bufferR = mergeBuffers(recBuffersR, recLength); + var interleaved = interleave(bufferL, bufferR); + var dataview = encodeWAV(interleaved); + var audioBlob = new Blob([dataview], { type: type }); + + this.postMessage(audioBlob); +} + +function exportMonoWAV(type){ + var bufferL = mergeBuffers(recBuffersL, recLength); + var dataview = encodeWAV(bufferL, true); + var audioBlob = new Blob([dataview], { type: type }); + + this.postMessage(audioBlob); +} + +function getBuffers() { + var buffers = []; + buffers.push( mergeBuffers(recBuffersL, recLength) ); + buffers.push( mergeBuffers(recBuffersR, recLength) ); + this.postMessage(buffers); +} + +function clear(){ + recLength = 0; + recBuffersL = []; + recBuffersR = []; +} + +function mergeBuffers(recBuffers, recLength){ + var result = new Float32Array(recLength); + var offset = 0; + for (var i = 0; i < recBuffers.length; i++){ + result.set(recBuffers[i], offset); + offset += recBuffers[i].length; + } + return result; +} + +function interleave(inputL, inputR){ + var length = inputL.length + inputR.length; + var result = new Float32Array(length); + + var index = 0, + inputIndex = 0; + + while (index < length){ + result[index++] = inputL[inputIndex]; + result[index++] = inputR[inputIndex]; + inputIndex++; + } + return result; +} + +function floatTo16BitPCM(output, offset, input){ + for (var i = 0; i < input.length; i++, offset+=2){ + var s = Math.max(-1, Math.min(1, input[i])); + output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); + } +} + +function writeString(view, offset, string){ + for (var i = 0; i < string.length; i++){ + view.setUint8(offset + i, string.charCodeAt(i)); + } +} + +function encodeWAV(samples, mono){ + var buffer = new ArrayBuffer(44 + samples.length * 2); + var view = new DataView(buffer); + + /* RIFF identifier */ + writeString(view, 0, 'RIFF'); + /* file length */ + view.setUint32(4, 32 + samples.length * 2, true); + /* RIFF type */ + writeString(view, 8, 'WAVE'); + /* format chunk identifier */ + writeString(view, 12, 'fmt '); + /* format chunk length */ + view.setUint32(16, 16, true); + /* sample format (raw) */ + view.setUint16(20, 1, true); + /* channel count */ + view.setUint16(22, mono?1:2, true); + /* sample rate */ + view.setUint32(24, sampleRate, true); + /* byte rate (sample rate * block align) */ + view.setUint32(28, sampleRate * 4, true); + /* block align (channel count * bytes per sample) */ + view.setUint16(32, 4, true); + /* bits per sample */ + view.setUint16(34, 16, true); + /* data chunk identifier */ + writeString(view, 36, 'data'); + /* data chunk length */ + view.setUint32(40, samples.length * 2, true); + + floatTo16BitPCM(view, 44, samples); + + return view; +}