sample degrade

by mohayonao

HTML

<script src="//mohayonao.github.io/neume.js/build/neume.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/0.10.6/vue.min.js"></script>
<div id="app">
    <button id="start" v-on="click:start">start</button>
    <input type="range" min="0.1" max="1.0" step="0.1" v-model="rate"> {{ rate }}
</div>

JavaScript

var Neume = neume(new AudioContext());

var Synth = new Neume(function($) {
    var out;
    
    out = $("sin");
    
    var x = 1;
    var rate = 0.7;
    var value = 0;
    
    out = $("script", { audioprocess: function(e) {
        var input = e.inputBuffer.getChannelData(0);
        var output = e.outputBuffer.getChannelData(0);
        
        for (var i = 0, imax = input.length; i < imax; ++i) {
            if (x >= 1) {
                x -= 1;
                value = input[i];
            }
            output[i] = value;
            x += rate;
        }
        
    } }, out);
    
    return out;
});
       
var synth = null;

new Vue({
    el: "#app",
    data: {
        rate: 0.7
    },
    methods: {
        start: function() {
            if (synth) {
                synth.fadeOut("+0", 0.5);
                synth = null;
            } else {
                synth = new Synth().fadeIn("+0", 0.5);
            }
        }
    }
});