From 8e5501bf3eab62d18fb8d77daaca06edd3465076 Mon Sep 17 00:00:00 2001 From: FMS-Cat Date: Sun, 4 Apr 2021 05:52:40 +0900 Subject: [PATCH] dev: MusicWrite, best for outputting a wav --- package.json | 2 ++ src/globals/music.ts | 2 +- src/music/MusicOffline.ts | 2 +- src/music/MusicWrite.ts | 15 +++++++++++++++ yarn.lock | 10 ++++++++++ 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/music/MusicWrite.ts diff --git a/package.json b/package.json index 537f1b2..ef40ea0 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,11 @@ "@fms-cat/automaton-with-gui": "^4.1.1", "@fms-cat/experimental": "^0.5.0", "@fms-cat/glcat-ts": "^0.14.2", + "@types/audiobuffer-to-wav": "^1.0.0", "@types/webpack-env": "^1.16.0", "@typescript-eslint/eslint-plugin": "^4.17.0", "@typescript-eslint/parser": "^4.17.0", + "audiobuffer-to-wav": "^1.0.0", "eslint": "^7.21.0", "eslint-plugin-sort-imports-es6-autofix": "^0.6.0", "glslify-loader": "^2.0.0", diff --git a/src/globals/music.ts b/src/globals/music.ts index 0cf5f1a..e5f2b95 100644 --- a/src/globals/music.ts +++ b/src/globals/music.ts @@ -8,7 +8,7 @@ let music: Music; if ( process.env.DEV ) { music = new MusicRealtime(); - // music = new MusicOffline(); + // music = new MusicWrite(); } else { music = new MusicOffline(); } diff --git a/src/music/MusicOffline.ts b/src/music/MusicOffline.ts index 48905d0..f165e8e 100644 --- a/src/music/MusicOffline.ts +++ b/src/music/MusicOffline.ts @@ -6,7 +6,7 @@ import { gl } from '../globals/canvas'; const BUFFER_LENGTH = 16384; export class MusicOffline extends Music { - private __buffer: AudioBuffer; + protected __buffer: AudioBuffer; private __currentBufferSource?: AudioBufferSourceNode | null; public constructor() { diff --git a/src/music/MusicWrite.ts b/src/music/MusicWrite.ts new file mode 100644 index 0000000..7daccd6 --- /dev/null +++ b/src/music/MusicWrite.ts @@ -0,0 +1,15 @@ +import { MusicOffline } from './MusicOffline'; +import toWav from 'audiobuffer-to-wav'; + +export class MusicWrite extends MusicOffline { + public async prepare(): Promise { + await super.prepare(); + + const b = toWav( this.__buffer ); + const blob = new Blob( [ b ] ); + const anchor = document.createElement( 'a' ); + anchor.href = URL.createObjectURL( blob ); + anchor.download = 'wenis.wav'; + anchor.click(); + } +} diff --git a/yarn.lock b/yarn.lock index 3e54740..acc0e62 100644 --- a/yarn.lock +++ b/yarn.lock @@ -100,6 +100,11 @@ "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" +"@types/audiobuffer-to-wav@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/audiobuffer-to-wav/-/audiobuffer-to-wav-1.0.0.tgz#4b974f50b96f3f760231b11b2e22dac33b2d2fbf" + integrity sha512-SbhLEr/BOWStZ0w9mPJLjUc6REGl+lUsf8M/opXy1jvAFfm+Ontt/8c0KZEvNY+TWy9NO1j/V+32uPCBNExpRg== + "@types/eslint-scope@^3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" @@ -571,6 +576,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +audiobuffer-to-wav@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/audiobuffer-to-wav/-/audiobuffer-to-wav-1.0.0.tgz#d5b432271455e7fee56b111cd0f8d620d7f9e105" + integrity sha1-1bQyJxRV5/7laxEc0PjWINf54QU= + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"