2016-10-11 2 views
0

Je voudrais essayer de faire un synthé en utilisant JavaScript, mais je ne trouve pas d'exemples de base sur la façon de le faire.Comment synchroniser une onde audio sinusoïdale avec JS?

Ce que j'ai compris de la recherche est qu'il appears to be possible et que vous devriez use a Canvas Pixel Array plutôt que des tableaux de ECMA normales

J'ai aussi trouvé des infos sur MDN Audio, et je l'ai vu des éléments audio utilisés pour la lecture en continu par web joueurs de radio avant, bien que je ne pouvais pas comprendre comment.

Mon but est de faire quelque chose qui me permette de synthétiser des ondes sinusoïdales continues et de les jouer en utilisant mon clavier sans utiliser d'échantillons pré-faits.

EDIT: Un des commentaires ci-dessous m'a orienté dans la bonne direction. Je travaille actuellement sur une solution, mais si vous souhaitez en poster un, n'hésitez pas.

+0

Would [ce] (https://developer.mozilla.org/en- US/docs/Web/API/Web_Audio_API/Visualizations_with_Web_Audio_API) vous orientent-ils dans la bonne direction? – bvx89

+0

Peut-être. Je viens aussi de trouver ceci: http://stackoverflow.com/questions/30019666/web-audio-synthesis-how-to-handle-changing-the-filter-cutoff-during-the-attack?rq=1 I finalement compris que la barre de recherche sur SO est pour les tags, pas de questions. –

+0

Oui. Cela m'a indiqué dans la très bonne direction. Répondra au message un peu, à moins que quelqu'un d'autre ne le fasse en premier. –

Répondre

0

Voici un exemple de base à partir de laquelle tout le monde devrait être en mesure de comprendre comment jouer sinusoïdes avec leur clavier:

<script type="text/javascript"> 
    //WARNING: VERY LOUD. TURN DOWN YOUR SPEAKERS BEFORE TESTING 

    // create web audio api context 
    var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); 

    // create Oscillator node 
    var oscillator = audioCtx.createOscillator(); 

    oscillator.type = 'sine'; 
    oscillator.frequency.value = 750; // value in hertz 
    oscillator.connect(audioCtx.destination); 
    oscillator.start(); 

    //uncomment for fun 
    // setInterval(changeFreq, 100); 

    //choose a random interval from a list of consonant ratios 
    var intervals = [1.0, 0.5, 0.3333, 1.5, 1.3333, 2.0, 2.25] 
    function changeFreq() { 
     var intervalIndex = ~~(Math.random() * intervals.length); 
     var noteFreq = oscillator.frequency.value * intervals[intervalIndex]; 

     //because this is random, make an effort to keep it in comfortable frequency range. 
     if(noteFreq > 1600) 
      noteFreq *= 0.5; 
     else if(noteFreq < 250) 
      noteFreq *= 2; 


     oscillator.frequency.value = noteFreq; 
    } 
</script> 

<body> 
<button onclick="changeFreq()">Change Places!</button> 
</body>