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!
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. –
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'? –
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. –