mirror of
https://github.com/kaythomas0/noisedash.git
synced 2025-11-11 19:06:20 +00:00
Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bb814e763 | ||
|
|
621576db14 | ||
|
|
80969ca029 | ||
|
|
26fc54054f | ||
|
|
8a1fc99fb5 | ||
|
|
e6cc5b36c5 | ||
|
|
6c4c24c166 | ||
|
|
9466ed692b | ||
|
|
5ace3d9996 | ||
|
|
c4642df353 | ||
|
|
aca7fbd1e0 | ||
|
|
90f4d50b7f | ||
|
|
66b23f39a6 | ||
|
|
4d22dab887 | ||
|
|
bc93b05c4e | ||
|
|
60a01908c2 | ||
|
|
5879e6d327 | ||
|
|
88cbfe0bf1 | ||
|
|
74c7d543c0 | ||
|
|
dc81a65c7a | ||
|
|
3358efce1d | ||
|
|
2d71af03d0 | ||
|
|
aae33a6121 | ||
|
|
cc3fe4608d | ||
|
|
38de3595c4 | ||
|
|
4330b04c1f | ||
|
|
70aa906110 | ||
|
|
55851a4cd0 | ||
|
|
3c738925bc | ||
|
|
3dbbf4c85d | ||
|
|
a3f7709adf | ||
|
|
496b71ee7b | ||
|
|
c2aad26e3f | ||
|
|
b84522847a |
BIN
.github/noisedash-screenshot-4.png
vendored
Normal file
BIN
.github/noisedash-screenshot-4.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 49 KiB |
20
README.md
20
README.md
@@ -11,7 +11,7 @@ Self-hostable web tool for generating ambient noises
|
||||
* Generate and customize ambient noises and user-uploadable samples (leveraging [Tone.js](https://github.com/Tonejs/Tone.js/))
|
||||
* Save "noise profiles" so you can easily switch between your created soundscapes. Import and export them for easy sharing, record them for use elsewhere
|
||||
* Fine-tune your noises with audio processing tools like filters, LFOs, and effects
|
||||
* Upload and edit audio samples (e.g rain, wind, thunder) to combine with your generated noises
|
||||
* Upload and edit audio samples (e.g rain, wind, thunder) to combine with your generated noises. Add effects to them and set playback modes
|
||||
* Use admin tools to manage multiple users
|
||||
* Mobile friendly
|
||||
|
||||
@@ -65,3 +65,21 @@ npm run server-prod
|
||||
# Contributing
|
||||
|
||||
See [CONTRIBUTING.md](https://github.com/kaythomas0/noisedash/blob/main/CONTRIBUTING.md)
|
||||
|
||||
# License
|
||||
|
||||
Noisedash, a self-hostable web tool for generating ambient noises
|
||||
Copyright (C) 2021 Kay Thomas <kaythomas@pm.me>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
261
package-lock.json
generated
261
package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "noisedash",
|
||||
"version": "0.5.0",
|
||||
"version": "0.6.5",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
@@ -1798,6 +1798,29 @@
|
||||
"integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
|
||||
"dev": true
|
||||
},
|
||||
"@jridgewell/source-map": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
|
||||
"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@jridgewell/gen-mapping": "^0.3.0",
|
||||
"@jridgewell/trace-mapping": "^0.3.9"
|
||||
},
|
||||
"dependencies": {
|
||||
"@jridgewell/gen-mapping": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
|
||||
"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@jridgewell/set-array": "^1.0.1",
|
||||
"@jridgewell/sourcemap-codec": "^1.4.10",
|
||||
"@jridgewell/trace-mapping": "^0.3.9"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@jridgewell/sourcemap-codec": {
|
||||
"version": "1.4.13",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
|
||||
@@ -2767,29 +2790,6 @@
|
||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
||||
"dev": true
|
||||
},
|
||||
"terser": {
|
||||
"version": "5.13.1",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz",
|
||||
"integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"acorn": "^8.5.0",
|
||||
"commander": "^2.20.0",
|
||||
"source-map": "~0.8.0-beta.0",
|
||||
"source-map-support": "~0.5.20"
|
||||
},
|
||||
"dependencies": {
|
||||
"source-map": {
|
||||
"version": "0.8.0-beta.0",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
|
||||
"integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"whatwg-url": "^7.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"terser-webpack-plugin": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
|
||||
@@ -2807,7 +2807,6 @@
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
|
||||
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
@@ -2825,8 +2824,7 @@
|
||||
"webidl-conversions": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
|
||||
},
|
||||
"webpack": {
|
||||
"version": "5.72.1",
|
||||
@@ -2870,9 +2868,7 @@
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
|
||||
"integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lodash.sortby": "^4.7.0",
|
||||
"tr46": "^1.0.1",
|
||||
"webidl-conversions": "^4.0.2"
|
||||
}
|
||||
@@ -3187,6 +3183,38 @@
|
||||
"strip-ansi": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"@vue/vue-loader-v15": {
|
||||
"version": "npm:vue-loader@15.10.0",
|
||||
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.0.tgz",
|
||||
"integrity": "sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@vue/component-compiler-utils": "^3.1.0",
|
||||
"hash-sum": "^1.0.2",
|
||||
"loader-utils": "^1.1.0",
|
||||
"vue-hot-reload-api": "^2.3.0",
|
||||
"vue-style-loader": "^4.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"hash-sum": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
|
||||
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
|
||||
"dev": true
|
||||
},
|
||||
"loader-utils": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
|
||||
"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"big.js": "^5.2.2",
|
||||
"emojis-list": "^3.0.0",
|
||||
"json5": "^1.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@webassemblyjs/ast": {
|
||||
"version": "1.11.1",
|
||||
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
|
||||
@@ -3499,6 +3527,15 @@
|
||||
"is-docker": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"jsonfile": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||
@@ -3674,29 +3711,6 @@
|
||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
||||
"dev": true
|
||||
},
|
||||
"terser": {
|
||||
"version": "5.13.1",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz",
|
||||
"integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"acorn": "^8.5.0",
|
||||
"commander": "^2.20.0",
|
||||
"source-map": "~0.8.0-beta.0",
|
||||
"source-map-support": "~0.5.20"
|
||||
},
|
||||
"dependencies": {
|
||||
"source-map": {
|
||||
"version": "0.8.0-beta.0",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
|
||||
"integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"whatwg-url": "^7.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"terser-webpack-plugin": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
|
||||
@@ -3736,7 +3750,6 @@
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
|
||||
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
@@ -3760,8 +3773,7 @@
|
||||
"webidl-conversions": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
|
||||
},
|
||||
"webpack": {
|
||||
"version": "5.72.1",
|
||||
@@ -3805,9 +3817,7 @@
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
|
||||
"integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lodash.sortby": "^4.7.0",
|
||||
"tr46": "^1.0.1",
|
||||
"webidl-conversions": "^4.0.2"
|
||||
}
|
||||
@@ -3974,47 +3984,6 @@
|
||||
"eslint-import-resolver-webpack": "^0.13.1"
|
||||
}
|
||||
},
|
||||
"@vue/vue-loader-v15": {
|
||||
"version": "npm:vue-loader@15.10.0",
|
||||
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.0.tgz",
|
||||
"integrity": "sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@vue/component-compiler-utils": "^3.1.0",
|
||||
"hash-sum": "^1.0.2",
|
||||
"loader-utils": "^1.1.0",
|
||||
"vue-hot-reload-api": "^2.3.0",
|
||||
"vue-style-loader": "^4.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"hash-sum": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
|
||||
"integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==",
|
||||
"dev": true
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"loader-utils": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
|
||||
"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"big.js": "^5.2.2",
|
||||
"emojis-list": "^3.0.0",
|
||||
"json5": "^1.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@vue/web-component-wrapper": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz",
|
||||
@@ -4313,7 +4282,7 @@
|
||||
"append-field": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
|
||||
"integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
|
||||
"integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="
|
||||
},
|
||||
"arch": {
|
||||
"version": "2.2.0",
|
||||
@@ -7459,8 +7428,7 @@
|
||||
"acorn": {
|
||||
"version": "8.7.1",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
|
||||
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
|
||||
"dev": true
|
||||
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A=="
|
||||
},
|
||||
"commander": {
|
||||
"version": "8.3.0",
|
||||
@@ -7472,36 +7440,14 @@
|
||||
"version": "0.8.0-beta.0",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
|
||||
"integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"whatwg-url": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"terser": {
|
||||
"version": "5.13.1",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz",
|
||||
"integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"acorn": "^8.5.0",
|
||||
"commander": "^2.20.0",
|
||||
"source-map": "~0.8.0-beta.0",
|
||||
"source-map-support": "~0.5.20"
|
||||
},
|
||||
"dependencies": {
|
||||
"commander": {
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"tr46": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
|
||||
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
@@ -7509,16 +7455,13 @@
|
||||
"webidl-conversions": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
|
||||
},
|
||||
"whatwg-url": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
|
||||
"integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lodash.sortby": "^4.7.0",
|
||||
"tr46": "^1.0.1",
|
||||
"webidl-conversions": "^4.0.2"
|
||||
}
|
||||
@@ -8260,12 +8203,6 @@
|
||||
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
|
||||
"dev": true
|
||||
},
|
||||
"lodash.sortby": {
|
||||
"version": "4.7.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
|
||||
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
|
||||
"dev": true
|
||||
},
|
||||
"lodash.truncate": {
|
||||
"version": "4.4.2",
|
||||
"resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
|
||||
@@ -9238,7 +9175,7 @@
|
||||
"pause": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
|
||||
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
|
||||
"integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
|
||||
},
|
||||
"picocolors": {
|
||||
"version": "1.0.0",
|
||||
@@ -9765,8 +9702,7 @@
|
||||
"punycode": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
|
||||
"dev": true
|
||||
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.10.3",
|
||||
@@ -10788,52 +10724,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"terser": {
|
||||
"version": "5.13.1",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.13.1.tgz",
|
||||
"integrity": "sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA==",
|
||||
"version": "5.14.2",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
|
||||
"integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@jridgewell/source-map": "^0.3.2",
|
||||
"acorn": "^8.5.0",
|
||||
"commander": "^2.20.0",
|
||||
"source-map": "~0.8.0-beta.0",
|
||||
"source-map-support": "~0.5.20"
|
||||
},
|
||||
"dependencies": {
|
||||
"source-map": {
|
||||
"version": "0.8.0-beta.0",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
|
||||
"integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"whatwg-url": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"tr46": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
|
||||
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"webidl-conversions": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
|
||||
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
|
||||
"dev": true
|
||||
},
|
||||
"whatwg-url": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
|
||||
"integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lodash.sortby": "^4.7.0",
|
||||
"tr46": "^1.0.1",
|
||||
"webidl-conversions": "^4.0.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"terser-webpack-plugin": {
|
||||
@@ -11036,7 +10935,7 @@
|
||||
"typedarray": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
||||
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
|
||||
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
|
||||
},
|
||||
"typedarray-to-buffer": {
|
||||
"version": "3.1.5",
|
||||
@@ -11409,9 +11308,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"vuetify": {
|
||||
"version": "2.6.6",
|
||||
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.6.6.tgz",
|
||||
"integrity": "sha512-H4KtxDFmDN8QiTRiGfBySyjMhVaHAJTKB0llGGKZT5jKxtnx9gvEtMWXKtVuRP0NJJP0H6xBPJHNOH7nT18qiQ=="
|
||||
"version": "2.6.10",
|
||||
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.6.10.tgz",
|
||||
"integrity": "sha512-fgUeRDDCwYkwu6WGEEKGe7IdfzOsXJCZGrqkn1pcS2ycuoDL8mR2/dejH5iFNnBY6MnsT365PAGn0J+9otjfQg=="
|
||||
},
|
||||
"vuetify-loader": {
|
||||
"version": "1.7.3",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "noisedash",
|
||||
"version": "0.5.0",
|
||||
"version": "0.6.5",
|
||||
"private": true,
|
||||
"author": "Kay Thomas <kaythomas@pm.me> (https://kaythomas.dev)",
|
||||
"scripts": {
|
||||
@@ -27,7 +27,7 @@
|
||||
"tone": "^14.7.77",
|
||||
"vue": "^2.6.11",
|
||||
"vue-router": "^3.5.4",
|
||||
"vuetify": "^2.6.6",
|
||||
"vuetify": "^2.6.10",
|
||||
"winston": "^3.3.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -36,7 +36,8 @@ app.use(session({
|
||||
store: new FileStore(fileStoreOptions),
|
||||
secret: sessionSecret,
|
||||
resave: true,
|
||||
saveUninitialized: true
|
||||
saveUninitialized: true,
|
||||
cookie: { sameSite: 'strict' }
|
||||
}))
|
||||
app.use((req, res, next) => {
|
||||
const msgs = req.session.messages || []
|
||||
|
||||
@@ -59,6 +59,7 @@ module.exports = function () {
|
||||
} else {
|
||||
const userVersion = row.user_version
|
||||
|
||||
db.serialize(() => {
|
||||
if (userVersion < 1) {
|
||||
db.run('ALTER TABLE samples ADD COLUMN fade_in REAL DEFAULT 0')
|
||||
db.run('ALTER TABLE samples ADD COLUMN loop_points_enabled INTEGER DEFAULT 0')
|
||||
@@ -73,6 +74,31 @@ module.exports = function () {
|
||||
|
||||
db.run('PRAGMA user_version = 2')
|
||||
}
|
||||
|
||||
if (userVersion < 3) {
|
||||
db.run('ALTER TABLE profiles_samples ADD COLUMN reverb_enabled INTEGER DEFAULT 0')
|
||||
db.run('ALTER TABLE profiles_samples ADD COLUMN reverb_pre_delay REAL DEFAULT 0')
|
||||
db.run('ALTER TABLE profiles_samples ADD COLUMN reverb_decay REAL DEFAULT 0')
|
||||
db.run('ALTER TABLE profiles_samples ADD COLUMN reverb_wet INTEGER DEFAULT 0')
|
||||
db.run('ALTER TABLE profiles_samples ADD COLUMN playback_mode TEXT DEFAULT "continuous"')
|
||||
db.run('ALTER TABLE profiles_samples ADD COLUMN sporadic_min INTEGER DEFAULT 30')
|
||||
db.run('ALTER TABLE profiles_samples ADD COLUMN sporadic_max INTEGER DEFAULT 300')
|
||||
|
||||
db.run('PRAGMA user_version = 3')
|
||||
}
|
||||
|
||||
if (userVersion < 4) {
|
||||
db.run('UPDATE users SET preferences = ? WHERE preferences = ?',
|
||||
['{"accentColor":{"alpha":1,"hex":"#607D8B","hexa":"#607D8BFF","hsla":{"h":200,"s":18,"l":46,"a":1},"hsva":{"h":200,"s":31,"v":55,"a":1},"hue":200,"rgba":{"r":96,"g":125,"b":139,"a":1}}}', '{}'],
|
||||
(err) => {
|
||||
if (err) {
|
||||
logger.error(err)
|
||||
} else {
|
||||
db.run('PRAGMA user_version = 4')
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -59,10 +59,28 @@ router.post('/profiles', (req, res) => {
|
||||
profileID = this.lastID
|
||||
|
||||
req.body.samples.forEach(s => {
|
||||
db.run('INSERT INTO profiles_samples (profile, sample, volume) VALUES (?, ?, ?)', [
|
||||
db.run(`INSERT INTO profiles_samples(
|
||||
profile,
|
||||
sample,
|
||||
volume,
|
||||
reverb_enabled,
|
||||
reverb_pre_delay,
|
||||
reverb_decay,
|
||||
reverb_wet,
|
||||
playback_mode,
|
||||
sporadic_min,
|
||||
sporadic_max)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
||||
profileID,
|
||||
s.id,
|
||||
s.volume
|
||||
s.volume,
|
||||
s.reverbEnabled,
|
||||
s.reverbPreDelay,
|
||||
s.reverbDecay,
|
||||
s.reverbWet,
|
||||
s.playbackMode,
|
||||
s.sporadicMin,
|
||||
s.sporadicMax
|
||||
],
|
||||
(err) => {
|
||||
if (err) {
|
||||
@@ -204,10 +222,28 @@ router.put('/profiles/:profileId', (req, res) => {
|
||||
})
|
||||
|
||||
req.body.samples.forEach(s => {
|
||||
db.run('INSERT INTO profiles_samples (profile, sample, volume) VALUES (?, ?, ?)', [
|
||||
db.run(`INSERT INTO profiles_samples(
|
||||
profile,
|
||||
sample,
|
||||
volume,
|
||||
reverb_enabled,
|
||||
reverb_pre_delay,
|
||||
reverb_decay,
|
||||
reverb_wet,
|
||||
playback_mode,
|
||||
sporadic_min,
|
||||
sporadic_max)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
||||
req.params.profileId,
|
||||
s.id,
|
||||
s.volume
|
||||
s.volume,
|
||||
s.reverbEnabled,
|
||||
s.reverbPreDelay,
|
||||
s.reverbDecay,
|
||||
s.reverbWet,
|
||||
s.playbackMode,
|
||||
s.sporadicMin,
|
||||
s.sporadicMax
|
||||
],
|
||||
(err) => {
|
||||
if (err) {
|
||||
@@ -355,6 +391,13 @@ router.get('/profiles/:profileId', (req, res) => {
|
||||
samples.id,
|
||||
name,
|
||||
profiles_samples.volume,
|
||||
profiles_samples.reverb_enabled as reverbEnabled,
|
||||
profiles_samples.reverb_pre_delay as reverbPreDelay,
|
||||
profiles_samples.reverb_decay as reverbDecay,
|
||||
profiles_samples.reverb_wet as reverbWet,
|
||||
profiles_samples.playback_mode as playbackMode,
|
||||
profiles_samples.sporadic_min as sporadicMin,
|
||||
profiles_samples.sporadic_max as sporadicMax,
|
||||
fade_in as fadeIn,
|
||||
loop_points_enabled as loopPointsEnabled,
|
||||
loop_start as loopStart,
|
||||
@@ -382,6 +425,13 @@ router.get('/profiles/:profileId', (req, res) => {
|
||||
sample.loopPointsEnabled = row.loopPointsEnabled === 1
|
||||
sample.loopStart = row.loopStart
|
||||
sample.loopEnd = row.loopEnd
|
||||
sample.reverbEnabled = row.reverbEnabled === 1
|
||||
sample.reverbPreDelay = row.reverbPreDelay
|
||||
sample.reverbDecay = row.reverbDecay
|
||||
sample.reverbWet = row.reverbWet
|
||||
sample.playbackMode = row.playbackMode
|
||||
sample.sporadicMin = row.sporadicMin
|
||||
sample.sporadicMax = row.sporadicMax
|
||||
|
||||
samples.push(sample)
|
||||
})
|
||||
|
||||
@@ -72,6 +72,8 @@ router.post('/users', (req, res) => {
|
||||
return res.sendStatus(500)
|
||||
}
|
||||
|
||||
const defaultPreferences = '{"accentColor":{"alpha":1,"hex":"#607D8B","hexa":"#607D8BFF","hsla":{"h":200,"s":18,"l":46,"a":1},"hsva":{"h":200,"s":31,"v":55,"a":1},"hue":200,"rgba":{"r":96,"g":125,"b":139,"a":1}}}'
|
||||
|
||||
if (row.count !== 0) {
|
||||
if (!req.user) {
|
||||
return res.sendStatus(401)
|
||||
@@ -94,15 +96,16 @@ router.post('/users', (req, res) => {
|
||||
return res.sendStatus(500)
|
||||
}
|
||||
|
||||
db.run(`INSERT INTO users (username, hashed_password, salt, name, is_admin, dark_mode, can_upload)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
||||
db.run(`INSERT INTO users (username, hashed_password, salt, name, is_admin, dark_mode, can_upload, preferences)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
||||
req.body.username,
|
||||
hashedPassword,
|
||||
salt,
|
||||
req.body.name,
|
||||
req.body.isAdmin,
|
||||
req.body.darkMode,
|
||||
req.body.canUpload
|
||||
req.body.canUpload,
|
||||
defaultPreferences
|
||||
], (err) => {
|
||||
if (err) {
|
||||
logger.error(err)
|
||||
@@ -125,15 +128,16 @@ router.post('/users', (req, res) => {
|
||||
return res.sendStatus(500)
|
||||
}
|
||||
|
||||
db.run(`INSERT INTO users (username, hashed_password, salt, name, is_admin, dark_mode, can_upload)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
||||
db.run(`INSERT INTO users (username, hashed_password, salt, name, is_admin, dark_mode, can_upload, preferences)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
||||
req.body.username,
|
||||
hashedPassword,
|
||||
salt,
|
||||
req.body.name,
|
||||
req.body.isAdmin,
|
||||
req.body.darkMode,
|
||||
req.body.canUpload
|
||||
req.body.canUpload,
|
||||
defaultPreferences
|
||||
], function (err) {
|
||||
if (err) {
|
||||
logger.error(err)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
<v-row justify="center">
|
||||
<v-btn
|
||||
:disabled="playDisabled || !isTimerValid"
|
||||
:disabled="playDisabled || !isTimerValid || (loadedSamples.length != 0 && !isSporadicValid)"
|
||||
class="mx-3 mb-5"
|
||||
fab
|
||||
large
|
||||
@@ -50,7 +50,7 @@
|
||||
label="Profiles"
|
||||
class="mx-3 mb-5"
|
||||
:disabled="playDisabled"
|
||||
@change="loadProfile"
|
||||
@change="loadProfile(true)"
|
||||
/>
|
||||
</v-row>
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
<v-card-text>
|
||||
<v-container>
|
||||
<v-row>
|
||||
<p>Select profile to record audio for. This is only supported on Chrome and Firefox.</p>
|
||||
<p>Select profile to record audio for. This is only supported on Chrome and Firefox. Current profile will be saved before recording.</p>
|
||||
</v-row>
|
||||
<v-row>
|
||||
<v-select
|
||||
@@ -652,10 +652,15 @@
|
||||
<v-row
|
||||
justify="center"
|
||||
>
|
||||
{{ sample.name }}
|
||||
</v-row>
|
||||
<v-col />
|
||||
|
||||
<v-row>
|
||||
<v-col>
|
||||
<h2 class="mb-5">
|
||||
{{ sample.name }}
|
||||
</h2>
|
||||
</v-col>
|
||||
|
||||
<v-col>
|
||||
<v-btn
|
||||
icon
|
||||
:disabled="playDisabled"
|
||||
@@ -663,7 +668,10 @@
|
||||
>
|
||||
<v-icon>mdi-delete</v-icon>
|
||||
</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-row>
|
||||
<v-slider
|
||||
v-model="sample.volume"
|
||||
label="Volume"
|
||||
@@ -679,6 +687,142 @@
|
||||
<p>{{ loadedSamples[index].volume }}</p>
|
||||
</div>
|
||||
</v-row>
|
||||
|
||||
<v-row
|
||||
justify="center"
|
||||
>
|
||||
<h3 class="font-weight-regular mb-9">
|
||||
Effects
|
||||
</h3>
|
||||
</v-row>
|
||||
|
||||
<v-expansion-panels class="mb-9">
|
||||
<v-expansion-panel>
|
||||
<v-expansion-panel-header>
|
||||
Reverb
|
||||
</v-expansion-panel-header>
|
||||
<v-expansion-panel-content>
|
||||
<v-row justify="center">
|
||||
<v-checkbox
|
||||
v-model="sample.reverbEnabled"
|
||||
:disabled="playDisabled"
|
||||
label="Enabled"
|
||||
/>
|
||||
</v-row>
|
||||
|
||||
<v-row justify="center">
|
||||
<v-slider
|
||||
v-model="sample.reverbPreDelay"
|
||||
:disabled="playDisabled || !sample.reverbEnabled"
|
||||
label="Pre Delay"
|
||||
thumb-label
|
||||
max="16"
|
||||
min="0"
|
||||
step="0.5"
|
||||
class="mx-3"
|
||||
/>
|
||||
<div
|
||||
class="mx-3"
|
||||
>
|
||||
<p>{{ sample.reverbPreDelay }}</p>
|
||||
</div>
|
||||
</v-row>
|
||||
|
||||
<v-row justify="center">
|
||||
<v-slider
|
||||
v-model="sample.reverbDecay"
|
||||
:disabled="playDisabled || !sample.reverbEnabled"
|
||||
label="Decay"
|
||||
thumb-label
|
||||
max="16"
|
||||
min="0"
|
||||
step="0.5"
|
||||
class="mx-3"
|
||||
@input="updateVolume"
|
||||
/>
|
||||
<div
|
||||
class="mx-3"
|
||||
>
|
||||
<p> {{ sample.reverbDecay }}</p>
|
||||
</div>
|
||||
</v-row>
|
||||
|
||||
<v-row justify="center">
|
||||
<v-slider
|
||||
v-model="sample.reverbWet"
|
||||
:disabled="playDisabled || !sample.reverbEnabled"
|
||||
label="Wet"
|
||||
thumb-label
|
||||
max="1"
|
||||
min="0"
|
||||
step="0.01"
|
||||
class="mx-3"
|
||||
@input="updateVolume"
|
||||
/>
|
||||
<div
|
||||
class="mx-3"
|
||||
>
|
||||
<p>{{ sample.reverbWet }}%</p>
|
||||
</div>
|
||||
</v-row>
|
||||
</v-expansion-panel-content>
|
||||
</v-expansion-panel>
|
||||
</v-expansion-panels>
|
||||
|
||||
<v-row justify="center">
|
||||
<h3 class="font-weight-regular">
|
||||
Playback Mode
|
||||
</h3>
|
||||
</v-row>
|
||||
|
||||
<v-row
|
||||
class="mb-5"
|
||||
>
|
||||
<v-radio-group
|
||||
v-model="sample.playbackMode"
|
||||
:disabled="playDisabled"
|
||||
mandatory
|
||||
>
|
||||
<v-radio
|
||||
label="Continuous (Looped)"
|
||||
value="continuous"
|
||||
/>
|
||||
<v-radio
|
||||
label="Sporadic (Not Looped, Plays Randomly Within Interval)"
|
||||
value="sporadic"
|
||||
/>
|
||||
</v-radio-group>
|
||||
</v-row>
|
||||
|
||||
<v-form
|
||||
v-model="isSporadicValid"
|
||||
>
|
||||
<v-row
|
||||
justify="center"
|
||||
>
|
||||
<v-text-field
|
||||
v-model="sample.sporadicMin"
|
||||
type="number"
|
||||
label="Sporadic Min"
|
||||
class="mx-3"
|
||||
:disabled="sample.playbackMode != 'sporadic' || playDisabled"
|
||||
:rules="[rules.gt(-1)]"
|
||||
/>
|
||||
|
||||
<v-text-field
|
||||
v-model="sample.sporadicMax"
|
||||
type="number"
|
||||
label="Sporadic Max"
|
||||
class="mx-3"
|
||||
:disabled="sample.playbackMode != 'sporadic' || playDisabled"
|
||||
:rules="[rules.gt(0)]"
|
||||
/>
|
||||
</v-row>
|
||||
</v-form>
|
||||
|
||||
<v-divider
|
||||
class="mt-7"
|
||||
/>
|
||||
</v-container>
|
||||
</v-row>
|
||||
|
||||
@@ -851,7 +995,8 @@
|
||||
<v-checkbox
|
||||
v-model="previewSampleLoopPointsEnabled"
|
||||
:disabled="previewSamplePlaying"
|
||||
label="Use Loop Points"
|
||||
label="Use Loop Points (Continuous Playback Mode Only)"
|
||||
@change="updatePreviewSampleLoopPoints"
|
||||
/>
|
||||
</v-row>
|
||||
|
||||
@@ -881,7 +1026,7 @@
|
||||
<v-text-field
|
||||
v-model="previewSampleFadeIn"
|
||||
type="number"
|
||||
label="Fade In Time"
|
||||
label="Fade In Time (In continuous mode, this only effects first playback)"
|
||||
:disabled="previewSamplePlaying"
|
||||
:rules="[rules.gt(-1)]"
|
||||
@change="updatePreviewSamplePlayerFadeIn"
|
||||
|
||||
@@ -75,6 +75,7 @@ export default {
|
||||
unwatch: null,
|
||||
confirmSwitchProfileDialog: false,
|
||||
activeProfile: {},
|
||||
isSporadicValid: false,
|
||||
errorSnackbar: false,
|
||||
errorSnackbarText: '',
|
||||
rules: {
|
||||
@@ -123,6 +124,13 @@ export default {
|
||||
|
||||
this.loadedSamples.forEach(s => {
|
||||
settings.push(s.volume)
|
||||
settings.push(s.reverbEnabled)
|
||||
settings.push(s.reverbPreDelay)
|
||||
settings.push(s.reverbDecay)
|
||||
settings.push(s.reverbWet)
|
||||
settings.push(s.playbackMode)
|
||||
settings.push(s.sporadicMin)
|
||||
settings.push(s.sporadicMax)
|
||||
})
|
||||
|
||||
return settings
|
||||
@@ -147,11 +155,13 @@ export default {
|
||||
this.stop()
|
||||
},
|
||||
methods: {
|
||||
play () {
|
||||
async play () {
|
||||
if (!this.players.loaded) {
|
||||
return
|
||||
}
|
||||
|
||||
await Tone.start()
|
||||
|
||||
this.playDisabled = true
|
||||
Tone.Transport.cancel()
|
||||
|
||||
@@ -178,35 +188,73 @@ export default {
|
||||
this.lfo.connect(this.filter.frequency).start()
|
||||
}
|
||||
|
||||
if (this.isTimerEnabled) {
|
||||
this.duration = parseInt((this.hours * 3600)) + parseInt((this.minutes * 60)) + parseInt(this.seconds)
|
||||
this.timeRemaining = this.duration
|
||||
this.transportInterval = setInterval(() => this.stop(), this.duration * 1000 + 100)
|
||||
this.timeRemainingInterval = setInterval(() => this.startTimer(), 1000)
|
||||
Tone.Transport.loopEnd = this.duration
|
||||
|
||||
this.noise.sync().start(0).stop(this.duration)
|
||||
} else {
|
||||
this.noise.sync().start(0)
|
||||
}
|
||||
|
||||
this.loadedSamples.forEach(s => {
|
||||
this.players.player(s.id).loop = true
|
||||
this.players.player(s.id).fadeIn = s.fadeIn
|
||||
if (s.loopPointsEnabled) {
|
||||
this.players.player(s.id).setLoopPoints(s.loopStart, s.loopEnd)
|
||||
} else {
|
||||
this.players.player(s.id).setLoopPoints(0, this.players.player(s.id).buffer.duration)
|
||||
}
|
||||
this.players.player(s.id).volume.value = s.volume
|
||||
})
|
||||
|
||||
if (this.isTimerEnabled) {
|
||||
this.duration = parseInt((this.hours * 3600)) + parseInt((this.minutes * 60)) + parseInt(this.seconds)
|
||||
this.noise.sync().start(0).stop(this.duration)
|
||||
Tone.Transport.loopEnd = this.duration
|
||||
this.timeRemaining = this.duration
|
||||
this.transportInterval = setInterval(() => this.stop(), this.duration * 1000 + 100)
|
||||
this.timeRemainingInterval = setInterval(() => this.startTimer(), 1000)
|
||||
|
||||
this.loadedSamples.forEach(s => {
|
||||
this.players.player(s.id).unsync().sync().start(0).stop(this.duration)
|
||||
})
|
||||
this.players.player(s.id).disconnect()
|
||||
if (s.reverbEnabled) {
|
||||
const reverb = new Tone.Reverb(s.reverbDecay).toDestination()
|
||||
reverb.set({ preDelay: s.reverbPreDelay, wet: s.reverbWet })
|
||||
this.players.player(s.id).connect(reverb)
|
||||
} else {
|
||||
this.noise.sync().start(0)
|
||||
|
||||
this.loadedSamples.forEach(s => {
|
||||
this.players.player(s.id).unsync().sync().start(0)
|
||||
})
|
||||
this.players.player(s.id).toDestination()
|
||||
}
|
||||
|
||||
Tone.Transport.start()
|
||||
if (s.playbackMode === 'sporadic') {
|
||||
this.players.player(s.id).loop = false
|
||||
|
||||
const maxInt = parseInt(s.sporadicMax, 10)
|
||||
const minInt = parseInt(s.sporadicMin, 10)
|
||||
|
||||
if (minInt <= maxInt) {
|
||||
const rand = Math.floor(Math.random() * (maxInt - minInt + 1) + minInt)
|
||||
s.initialSporadicPlayInterval = setInterval(() => this.playSporadicSample(s.id), rand * 1000)
|
||||
}
|
||||
} else {
|
||||
this.players.player(s.id).loop = true
|
||||
|
||||
if (this.isTimerEnabled) {
|
||||
this.players.player(s.id).unsync().sync().start(0).stop(this.duration)
|
||||
} else {
|
||||
this.players.player(s.id).unsync().sync().start(0)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
Tone.Transport.start('+0.1')
|
||||
},
|
||||
playSporadicSample (id) {
|
||||
const sample = this.loadedSamples.find(s => s.id === id)
|
||||
|
||||
clearInterval(sample.initialSporadicPlayInterval)
|
||||
clearInterval(sample.sporadicInterval)
|
||||
|
||||
this.players.player(id).unsync().sync().start()
|
||||
|
||||
const maxInt = parseInt(sample.sporadicMax, 10)
|
||||
const minInt = parseInt(sample.sporadicMin, 10)
|
||||
sample.playNextTime = Math.floor(Math.random() * (maxInt - minInt + 1) + minInt)
|
||||
|
||||
sample.sporadicInterval = setInterval(() => this.playSporadicSample(id), sample.playNextTime * 1000)
|
||||
},
|
||||
stop () {
|
||||
clearInterval(this.transportInterval)
|
||||
@@ -216,6 +264,13 @@ export default {
|
||||
clearInterval(this.timeRemainingInterval)
|
||||
this.timeRemaining = 0
|
||||
this.duration = 0
|
||||
|
||||
this.loadedSamples.forEach(s => {
|
||||
if (s.playbackMode === 'sporadic') {
|
||||
clearInterval(s.initialSporadicPlayInterval)
|
||||
clearInterval(s.sporadicInterval)
|
||||
}
|
||||
})
|
||||
},
|
||||
startTimer () {
|
||||
this.timeRemaining -= 1
|
||||
@@ -289,7 +344,7 @@ export default {
|
||||
}
|
||||
this.exportedProfile = this.profileItems[0]
|
||||
this.recordedProfile = this.profileItems[0]
|
||||
this.loadProfile()
|
||||
this.loadProfile(true)
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -365,8 +420,8 @@ export default {
|
||||
this.errorSnackbar = true
|
||||
})
|
||||
},
|
||||
loadProfile () {
|
||||
if (this.unsavedWork) {
|
||||
loadProfile (checkForUnsavedWork) {
|
||||
if (checkForUnsavedWork && this.unsavedWork) {
|
||||
this.confirmSwitchProfileDialog = true
|
||||
} else {
|
||||
this.$http.get('/profiles/'.concat(this.selectedProfile.id))
|
||||
@@ -470,6 +525,8 @@ export default {
|
||||
this.checkedSamples.forEach(i => {
|
||||
const load = this.allSamples.find(e => e.id === i)
|
||||
load.volume = -10
|
||||
load.sporadicMin = 30
|
||||
load.sporadicMax = 300
|
||||
this.loadedSamples.push(load)
|
||||
})
|
||||
|
||||
@@ -652,6 +709,13 @@ export default {
|
||||
}
|
||||
})
|
||||
},
|
||||
updatePreviewSampleLoopPoints () {
|
||||
if (this.previewSampleLoopPointsEnabled) {
|
||||
this.samplePreviewPlayer.setLoopPoints(this.previewSampleLoopStart, this.previewSampleLoopEnd)
|
||||
} else {
|
||||
this.samplePreviewPlayer.setLoopPoints(0, this.samplePreviewPlayer.buffer.duration)
|
||||
}
|
||||
},
|
||||
previewSample () {
|
||||
if (this.previewSamplePlaying) {
|
||||
this.previewSamplePlaying = false
|
||||
@@ -672,7 +736,16 @@ export default {
|
||||
}).then(response => {
|
||||
if (response.status === 200) {
|
||||
this.getSamples()
|
||||
this.loadProfile()
|
||||
|
||||
// Update sample if it's already loaded in current profile
|
||||
const sample = this.loadedSamples.find(s => s.id === this.selectedPreviewSample.id)
|
||||
if (sample) {
|
||||
sample.fadeIn = this.previewSampleFadeIn
|
||||
sample.loopPointsEnabled = this.previewSampleLoopPointsEnabled
|
||||
sample.loopStart = this.previewSampleLoopStart
|
||||
sample.loopEnd = this.previewSampleLoopEnd
|
||||
}
|
||||
|
||||
this.closeEditSampleForm()
|
||||
this.infoSnackbarText = 'Sample Saved'
|
||||
this.infoSnackbar = true
|
||||
@@ -696,6 +769,9 @@ export default {
|
||||
this.profileMoreDialog = false
|
||||
},
|
||||
startRecording () {
|
||||
// Save current profile before recording
|
||||
this.updateProfile()
|
||||
|
||||
this.$http.get('/profiles/'.concat(this.recordedProfile.id))
|
||||
.then(async response => {
|
||||
if (response.status === 200) {
|
||||
@@ -764,22 +840,45 @@ export default {
|
||||
this.players.player(s.id).fadeIn = s.fadeIn
|
||||
if (s.loopPointsEnabled) {
|
||||
this.players.player(s.id).setLoopPoints(s.loopStart, s.loopEnd)
|
||||
} else {
|
||||
this.players.player(s.id).setLoopPoints(0, this.players.player(s.id).buffer.duration)
|
||||
}
|
||||
this.players.player(s.id).volume.value = s.volume
|
||||
|
||||
this.players.player(s.id).connect(this.recorder)
|
||||
this.players.player(s.id).unsync().sync().start(0)
|
||||
this.players.player(s.id).disconnect()
|
||||
if (s.reverbEnabled) {
|
||||
const reverb = new Tone.Reverb(s.reverbDecay).connect(this.recorder).toDestination()
|
||||
reverb.set({ preDelay: s.reverbPreDelay, wet: s.reverbWet })
|
||||
this.players.player(s.id).connect(reverb)
|
||||
} else {
|
||||
this.players.player(s.id).connect(this.recorder).toDestination()
|
||||
}
|
||||
})
|
||||
|
||||
this.noise.sync().start(0)
|
||||
|
||||
Tone.Transport.start()
|
||||
this.loadedSamples.forEach(s => {
|
||||
if (s.playbackMode === 'sporadic') {
|
||||
this.players.player(s.id).loop = false
|
||||
|
||||
const maxInt = parseInt(s.sporadicMax, 10)
|
||||
const minInt = parseInt(s.sporadicMin, 10)
|
||||
const rand = Math.floor(Math.random() * (maxInt - minInt + 1) + minInt)
|
||||
|
||||
s.initialSporadicPlayInterval = setInterval(() => this.playSporadicSample(s.id), rand * 1000)
|
||||
} else {
|
||||
this.players.player(s.id).loop = true
|
||||
this.players.player(s.id).unsync().sync().start(0)
|
||||
}
|
||||
})
|
||||
|
||||
Tone.Transport.start('+0.1')
|
||||
},
|
||||
async stopRecording () {
|
||||
const recording = await this.recorder.stop()
|
||||
|
||||
// Set active profile back to the selected one
|
||||
this.loadProfile()
|
||||
this.loadProfile(false)
|
||||
|
||||
const url = URL.createObjectURL(recording)
|
||||
const anchor = document.createElement('a')
|
||||
@@ -788,6 +887,14 @@ export default {
|
||||
anchor.click()
|
||||
|
||||
clearInterval(this.recordingInterval)
|
||||
|
||||
this.loadedSamples.forEach(s => {
|
||||
if (s.playbackMode === 'sporadic') {
|
||||
clearInterval(s.initialSporadicPlayInterval)
|
||||
clearInterval(s.sporadicInterval)
|
||||
}
|
||||
})
|
||||
|
||||
this.recordingDialog = false
|
||||
this.stop()
|
||||
},
|
||||
@@ -795,7 +902,7 @@ export default {
|
||||
await this.recorder.stop()
|
||||
|
||||
// Set active profile back to the selected one
|
||||
this.loadProfile()
|
||||
this.loadProfile(false)
|
||||
|
||||
clearInterval(this.recordingInterval)
|
||||
this.recordingDialog = false
|
||||
@@ -803,7 +910,7 @@ export default {
|
||||
},
|
||||
discardChanges () {
|
||||
this.unsavedWork = false
|
||||
this.loadProfile()
|
||||
this.loadProfile(true)
|
||||
this.confirmSwitchProfileDialog = false
|
||||
},
|
||||
saveChanges () {
|
||||
|
||||
Reference in New Issue
Block a user