|  |  | @@ -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 { | 
		
	
	
		
			
				|  |  | 
 |