import types from '../types' import Tone from 'tone' import JSZip from 'jszip' import FileSaver from 'file-saver' import { sprintf } from 'sprintf-js' import * as draw from './lib/draw' import output from './lib/output' import spectrum from './lib/spectrum' import { requestAudioContext } from './lib' const FRAME_LENGTH = 126 * 255 const FRAME_OFFSET = FRAME_LENGTH / 4 const _r = 8 const _i = 8 // requestAudioContext(() => {}) export const loadBuffer = file => { return new Promise((resolve, reject) => { const url = URL.createObjectURL(file) let buffer = new Tone.Buffer( url, loadBuffer, err => { console.error('err', err) reject(err) } ) function loadBuffer() { URL.revokeObjectURL(url) resolve(buffer) } }) } export const loadPCM = (file) => { return new Promise((resolve, reject) => { loadBuffer(file).then(buffer => { const pcm = buffer._buffer.getChannelData(0) const sr = buffer._buffer.sampleRate if (! pcm) return reject() console.log(buffer, pcm, sr) resolve({ buffer, pcm, sr }) }) }) } export const renderFrames = (file, { frame_offset=FRAME_OFFSET, max=10 }) => dispatch => { return new Promise((resolve, reject) => { loadPCM(file).then(({ buffer, pcm, sr }) => { dispatch({ type: types.wav2pix.loaded_buffer }) let canvases = [] for (let offset = 0, count = 0, _len = pcm.length - FRAME_LENGTH; offset < _len && count < max; offset += frame_offset, count += 1 ) { canvases.push(render(pcm.slice(offset, offset+FRAME_LENGTH), sr, count)) } dispatch({ type: types.wav2pix.draw_finish }) resolve(canvases) }) }) } export const buildZip = (name, file, { frame_offset=FRAME_OFFSET, max=10000 }) => dispatch => { return new Promise((resolve, reject) => { loadPCM(file).then(({ buffer, pcm, sr }) => { dispatch({ type: types.wav2pix.loaded_buffer }) const zip = new JSZip() const zip_folder = zip.folder("wav2pix_" + name); let offset = 0, count = 0, _len = pcm.length - FRAME_LENGTH for (; offset < _len && count < max; offset += frame_offset, count += 1 ) { if ((count % 10) === 0) { dispatch({ type: types.wav2pix.draw_progress, count }) } render(pcm.slice(offset, offset+FRAME_LENGTH), sr, count, zip_folder) } // dispatch event dispatch({ type: types.wav2pix.draw_finish }) zip.generateAsync({ type: "blob" }).then(content => { dispatch({ type: types.wav2pix.load_zip }) // FileSaver.saveAs(content, "wav2pix_" + name + ".zip") resolve({ zip: content, name: "wav2pix_" + name + ".zip", count }) }) }) }) } function render(pcm, sr, count, zip){ const fft = spectrum.toSpectrum(pcm, sr) // console.log('render', fft) // const pcm_rev = pcm.slice().reverse() // const spec_rev = spectrum.toSpectrum(pcm_rev, spec.sr) const { canvas, imageData } = draw.raw_spectrum(fft, 0, 256, 0, 256, _r, _i) if (zip) { const name = sprintf('frame_%05d.png', count) const dataURL = canvas.toDataURL("image/png") zip.file(name, dataURL.split(',')[1], {base64: true}) } return { fft, canvas, imageData } }