2017-08-18 2 views
1

J'ai passé des heures avec mes connaissances en traitement novice en essayant de transformer un programme de traitement en un équivalent en ligne pour les étudiants. Je cherche l'aide des masses!Manipulation du son p5.js ou processing.js

Le plus gros problème est qu'il n'y a pas de bibliothèque Minim dans processing.js ou p5.js. En d'autres termes, j'aimerais que le programme ci-dessous fonctionne dans OpenProcessing.org. Le programme de traitement audio permet aux étudiants de

Je me sens comme je l'ai longuement peigné par http://processingjs.org/reference/ et https://p5js.org/reference/#/libraries/p5.sound en vain.

La grosse affaire se passe dans la classe myEffect. La fonction process() lit dans la mémoire un tableau des échantillons et traite chacun d'eux un à la fois. Je voudrais dupliquer cette capacité dans openprocessing.org. La ligne que les étudiants changent est

newSamp[j] = samp[j];

à quelque chose comme

newSamp[j] = samp[j] * 2;

puis expliquer comment il a changé le son.

Voici le programme sous forme de traitement d'origine:

import ddf.minim.spi.*; 
import ddf.minim.signals.*; 
import ddf.minim.*; 
import ddf.minim.analysis.*; 
import ddf.minim.ugens.*; 
import ddf.minim.effects.*; 

Minim minim; 
AudioPlayer song; 
float[] oldSamp; 
String songFileName = "BasicDrum.mp3"; 
final int BUFFERSIZE = 4096; 

void setup() 
{ 
    size(640,200); 
    stroke(255); 
    textSize(32); 

    minim = new Minim(this); 
    song = minim.loadFile(songFileName, BUFFERSIZE); 
    song.addEffect(new MyEffect()); 
    oldSamp = new float[song.bufferSize()]; 
    song.play(); 
} 


void draw() 
{ 
    /* Draw the Visualizer */ 
    background(0); 
    fill(#BBBB00); 
    text("Mono Channel", 50, 50); 
    for (int i = 0; i < song.bufferSize() - 1; i++) 
    { 
    line(i, 100 + song.left.get(i)*100, i+1, 100 +song.left.get(i+1)*100); 
    } 
} 

class MyEffect implements AudioEffect 
{ 

    void process(float[] samp) 
    { 
    float[] newSamp = samp.clone(); //create a copy to alter 
    int j = 0; 
    while (j < newSamp.length) 
    { 
     newSamp[j] = samp[j];   /* HERE is where we alter each sample */ 
     j = j + 1; 
    } 
    oldSamp = samp.clone();   //save a copy of this for later 
    // we have to copy the values back into samp for this to work 
    arrayCopy(newSamp, samp); 
    } 

    void process(float[] left, float[] right) 
    //stereo has left and right channels 
    { 
    float[] average = left; 
    for (int i = 0; i < left.length; i++) 
     {  
     average[i] = (left[i] + right[i])/2.0; 
     } 
    process(average); 
    } 
} 

Merci pour tout conseils que vous pouvez fournir!

+0

si vous voulez faire la même chose en p5.js il pourrait être plus facile de réécrire le code en javascript. Commencez par les exemples sonores [p5.js] (https://p5js.org/examples/). Notez qu'un son p5 possède une propriété 'buffer' qui est une instance [AudioBuffer] (https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer) que vous pouvez utiliser pour manipuler les échantillons, similaire à comment le traitement AudioEffect fait. –

+0

Je n'ai pas trouvé de propriété 'buffer' dans la référence. Tout ce que j'ai pu trouver était 'reverseBuffer' (https://p5js.org/reference/#/p5.SoundFile/reverseBuffer). Pourriez-vous me montrer où vous avez trouvé la propriété 'buffer'? –

+0

Il se peut qu'il ne soit pas dans la documentation, mais vous devriez jouer avec la console JS dans votre navigateur. Par exemple, tapez le nom de l'instance de p5.SoundFile et consultez ses propriétés.'buffer' devrait être là et vous devriez pouvoir étendre ses propriétés. –

Répondre

0

Vous ne serez pas en mesure de traduire directement cette ligne par ligne de Processing vers Processing.js ou P5.js, comme vous avez découvert qu'il n'y a pas de version JavaScript de Minim. (Eh bien, il est, mais il est assez vieux.)

(un pas en arrière, vous ne devriez jamais essayer de traduire le code d'une langue à l'autre en allant ligne par ligne.)

Au lieu de cela, ce vous devez faire est de prendre ce que le code fait et ensuite comprendre comment faire cela dans votre langue cible (dans votre cas, JavaScript).

Je commencerais par googler "son p5.js" ou "traitement son .js" ou "son JavaScript". Encore une fois, votre objectif est de comprendre comment jouer des sons en JavaScript, pas de recréer Minim line-by-line.

Voir aussi: