|
|
|
@@ -1,40 +1,26 @@ |
|
|
|
<template> |
|
|
|
<h1>Dissolve</h1> |
|
|
|
<div>This is a mega-early-alpha vore audio generator.</div> |
|
|
|
<div> |
|
|
|
Follow <a href="https://twitter.com/causticcrux">@causticcrux</a> for more. |
|
|
|
<div id="app-area"> |
|
|
|
<Menu /> |
|
|
|
|
|
|
|
<div id="soundscapes"> |
|
|
|
<SoundscapeComp |
|
|
|
v-for="(soundscape, index) in soundscapes" |
|
|
|
:key="index" |
|
|
|
:soundscape="soundscape" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div> |
|
|
|
Many sounds by <a href="https://www.furaffinity.net/user/jeschke">Jit</a>! |
|
|
|
</div> |
|
|
|
<button v-on:click="start" class="start-button" v-if="!started"> |
|
|
|
Start |
|
|
|
</button> |
|
|
|
<button v-on:click="addSoundscape" class="start-button" v-if="started"> |
|
|
|
Add Soundscape |
|
|
|
</button> |
|
|
|
<SoundscapeComp |
|
|
|
v-for="(soundscape, index) in soundscapes" |
|
|
|
:key="index" |
|
|
|
:soundscape="soundscape" |
|
|
|
/> |
|
|
|
|
|
|
|
<button v-on:click="clear">Delete all cached sound (if it gets stuck)</button> |
|
|
|
</template> |
|
|
|
|
|
|
|
<script lang="ts"> |
|
|
|
import { Options, Vue } from "vue-class-component"; |
|
|
|
import { clearCache, setup, Soundscape } from "./audio"; |
|
|
|
import SoundscapeComp from "./components/SoundscapeComp.vue"; |
|
|
|
import { Filter } from "./filters/Filter"; |
|
|
|
import { HighpassFilter } from "./filters/HighpassFilter"; |
|
|
|
import { LowpassFilter } from "./filters/LowpassFilter"; |
|
|
|
import { StereoWidthFilter } from "./filters/StereoWidthFilter"; |
|
|
|
import { LoopingSource } from "./sources/LoopingSource"; |
|
|
|
import * as Sources from "./sources/PremadeSources"; |
|
|
|
import Menu from "./components/Menu.vue"; |
|
|
|
@Options({ |
|
|
|
components: { |
|
|
|
SoundscapeComp, |
|
|
|
Menu, |
|
|
|
}, |
|
|
|
}) |
|
|
|
export default class Dissolve extends Vue { |
|
|
|
@@ -42,59 +28,19 @@ export default class Dissolve extends Vue { |
|
|
|
started = false; |
|
|
|
soundscapes: Array<Soundscape> = []; |
|
|
|
|
|
|
|
addSoundscape(): void { |
|
|
|
const scape: Soundscape = new Soundscape(); |
|
|
|
scape.addSource(Sources.makeGlorps()); |
|
|
|
scape.addSource(Sources.makeGurgles()); |
|
|
|
scape.addSource(Sources.makeHeartbeat()); |
|
|
|
scape.addSource(Sources.makeRumble()); |
|
|
|
scape.addSource(Sources.makeSquishing()); |
|
|
|
scape.addSource(Sources.makeBreathing()); |
|
|
|
scape.addSource(Sources.makeBurps()); |
|
|
|
|
|
|
|
scape.addFilter(new LowpassFilter()); |
|
|
|
scape.addFilter(new HighpassFilter()); |
|
|
|
scape.addFilter(new StereoWidthFilter()); |
|
|
|
|
|
|
|
addSoundscape(scape: Soundscape): void { |
|
|
|
scape.output.connect(this.context.destination); |
|
|
|
|
|
|
|
this.soundscapes.push(scape); |
|
|
|
} |
|
|
|
start(): void { |
|
|
|
this.started = true; |
|
|
|
|
|
|
|
const internal: Soundscape = new Soundscape(); |
|
|
|
internal.addSource(Sources.makeGlorps()); |
|
|
|
internal.addSource(Sources.makeGurgles()); |
|
|
|
internal.addSource(Sources.makeHeartbeat()); |
|
|
|
internal.addSource(Sources.makeRumble()); |
|
|
|
internal.addSource(Sources.makeSquishing()); |
|
|
|
|
|
|
|
internal.output.connect(this.context.destination); |
|
|
|
|
|
|
|
this.soundscapes.push(internal); |
|
|
|
|
|
|
|
const external: Soundscape = new Soundscape(); |
|
|
|
|
|
|
|
const breathing: LoopingSource = Sources.makeBreathing(); |
|
|
|
breathing.volume = 0.3; |
|
|
|
external.addSource(breathing); |
|
|
|
external.addSource(Sources.makeBurps()); |
|
|
|
|
|
|
|
const lowpass: Filter = new LowpassFilter(); |
|
|
|
lowpass.active = true; |
|
|
|
external.addFilter(lowpass); |
|
|
|
const highpass: Filter = new HighpassFilter(); |
|
|
|
highpass.active = false; |
|
|
|
external.addFilter(highpass); |
|
|
|
|
|
|
|
external.output.connect(this.context.destination); |
|
|
|
|
|
|
|
this.soundscapes.push(external); |
|
|
|
} |
|
|
|
|
|
|
|
mounted(): void { |
|
|
|
this.context = setup(); |
|
|
|
|
|
|
|
this.addSoundscape(new Soundscape()); |
|
|
|
} |
|
|
|
|
|
|
|
clear(): void { |
|
|
|
@@ -104,17 +50,54 @@ export default class Dissolve extends Vue { |
|
|
|
</script> |
|
|
|
|
|
|
|
<style> |
|
|
|
@import url("https://fonts.googleapis.com/css2?family=Coda&display=swap"); |
|
|
|
|
|
|
|
html { |
|
|
|
width: 100vw; |
|
|
|
height: 100vh; |
|
|
|
margin: 0; |
|
|
|
padding: 0; |
|
|
|
} |
|
|
|
body { |
|
|
|
margin: 0; |
|
|
|
padding: 0; |
|
|
|
background: #111; |
|
|
|
width: 100%; |
|
|
|
height: 100%; |
|
|
|
} |
|
|
|
|
|
|
|
#dissolve-title { |
|
|
|
margin-top: 0; |
|
|
|
} |
|
|
|
|
|
|
|
#app { |
|
|
|
font-family: Avenir, Helvetica, Arial, sans-serif; |
|
|
|
font-family: "Coda", cursive; |
|
|
|
-webkit-font-smoothing: antialiased; |
|
|
|
-moz-osx-font-smoothing: grayscale; |
|
|
|
text-align: center; |
|
|
|
color: #ddd; |
|
|
|
background: #111; |
|
|
|
margin-top: 60px; |
|
|
|
height: 100%; |
|
|
|
width: 100%; |
|
|
|
box-sizing: border-box; |
|
|
|
} |
|
|
|
|
|
|
|
#app-area { |
|
|
|
display: flex; |
|
|
|
flex-direction: row; |
|
|
|
height: 100%; |
|
|
|
width: 100%; |
|
|
|
} |
|
|
|
|
|
|
|
#menu { |
|
|
|
flex: 1 0 100px; |
|
|
|
} |
|
|
|
|
|
|
|
#soundscapes { |
|
|
|
flex: 5 0 50vw; |
|
|
|
display: grid; |
|
|
|
grid-template-columns: 400px 400px 400px; |
|
|
|
grid-auto-rows: auto-fit; |
|
|
|
} |
|
|
|
|
|
|
|
.start-button { |
|
|
|
|