We are about to switch to a new forum software. Until then we have removed the registration on this forum.
I have worked on a piece of code that generates notes and beats from tweets. And, I am struggling with a beat part where I use an example code called bitCrushBeatExample as a drum sound for this sound project. I found out that after running this for a long time, like an hour, the speaker produces noise and keeps itself open for signal. Please click here to see the video. You can hear the noise at the 10th second.
As I tried several ways to turn it off, right now the bitCrush.unpatch(out) works for me. I use bitCrush.patch(out) again when the program run into a scene to generate sound again. However, the noise from the speaker will come back and play along with the other note and beat sounds.
Here is a rewritten shorten code. This code will runs fine without noise when the note is off after the 16 sec. But, I put it here because the actual code (a very long one) is similar to this.
// bitCrushBeatExample
import ddf.minim.*;
import ddf.minim.ugens.*;
import ddf.minim.effects.*; // for BandPass
Minim minim;
Summer sum;
BitCrush bitCrush;
Line bitRateLine;
AudioOutput out;
AudioPlayer player;
AudioSample player_copy;
Timer time;
int scene=0;
int round=0;
boolean soundOn= true;
void setup()
{
// initialize the drawing window
size( 512, 200, P2D );
// initialize the minim and out objects
minim = new Minim( this );
out = minim.getLineOut( Minim.MONO );
player=minim.loadFile("dialupSound.mp3");
player_copy=minim.loadSample("dialupSound.mp3");
// make our summer and bit crush ugens
sum = new Summer();
bitCrush = new BitCrush(16.f, out.sampleRate());
// we're going to do 4 measures of 120 bpm, so that's 8 seconds.
// we'll just ramp from half the sample rate to 100 Hz
bitRateLine = new Line(8.f, out.sampleRate()*0.25f, 100 );
// connect the line to the bit crush resolution
bitRateLine.patch( bitCrush.bitRate );
// set up our signal chain
sum.patch( bitCrush ).patch( out );
// pause time when adding a bunch of notes at once
out.pauseNotes();
// we set the tempo of the output so that the time and duration arguments
// of playNote now are expressed in beats
out.setTempo( 60.f );
println(round+"------------time is reset-----------");
time = new Timer (24000);
scene=1;
}
// draw is run many times
void draw()
{
textAlign(CENTER);
background( 0 );
fill(255);
switch(scene) {
case 1:
text("This is scene 1", width/2, (height/2)-30);
text("click anywhere to go to scene 2", width/2, height/2);
break;
case 2:
text("This is scene 2", width/2, (height/2)-30);
text ("play.isPlaying(), at the end will go to scene 3 then, play_loadSample", width/2, height/2);
text("no mouse click", width/2, (height/2)+30);
if (!player.isPlaying()) {
if ( !soundOn) {
bitCrush.patch(out);
playDrum();
soundOn=true;
}
player=minim.loadFile("dialupSound_effect.mp3");
player.play();
scene++;
time.reset();
}
break;
case 3:
text("This is scene 3", width/2, (height/2)-30);
text ("click here to pause/play beat", (width/2)-100, height/2);
text ("click here to go to scene 1", (width/2)+100, height/2);
// draw using a white stroke
stroke( 255 );
// draw the waveforms
for ( int i = 0; i < out.bufferSize() - 1; i++ )
{
// find the x position of each buffer value
float x1 = map( i, 0, out.bufferSize(), 0, width );
float x2 = map( i+1, 0, out.bufferSize(), 0, width );
// draw a line from one buffer position to the next for both channels
line( x1, 50 + out.left.get(i)*50, x2, 50 + out.left.get(i+1)*50);
line( x1, 150 + out.right.get(i)*50, x2, 150 + out.right.get(i+1)*50);
}
if ( time.isDone()) {
//out.pauseNotes();
playDrum();
time.reset();
round++;
println(round+"------------time is reset-----------");
}
text(time.getCurrentTime(), 20, 30);
time.update();
break;
}
}
void playDrum() {
float kickDur = 0.8;
float snareDur = 0.2;
out.pauseNotes();
for (int i = 0; i < 4; i++)
{
out.setNoteOffset( i * 4 );
// we set the note offset so that each loop we are queuing up a new measure
out.playNote( 0, kickDur, new KickInstrument( sum ) );
println("note 1");
out.playNote( 1, snareDur, new SnareInstrument( sum ) );
out.playNote( 1.5, kickDur, new KickInstrument( sum ) );
println("note 2");
out.playNote( 2.5, kickDur, new KickInstrument( sum ) );
println("note 3");
out.playNote( 3, snareDur, new SnareInstrument( sum ) );
out.playNote( 3.5, snareDur, new SnareInstrument( sum ) );
out.playNote( 2.5, kickDur, new KickInstrument( sum ) );
println("note 4");
// every other measure give a little kick at the end
if ( i % 2 == 1 )
{
out.playNote( 3.75, 0.1, new KickInstrument( sum ) );
println("little kick");
}
}
// activate the line and unpause the output!
bitRateLine.activate();
out.resumeNotes();
//out.pauseNotes();
}
void mousePressed() {
switch(scene) {
case 1:
player.play();
scene++;
break;
case 3:
if (mouseX <= width/2) {
if (soundOn) { // play and puase
println("pause");
bitCrush.unpatch(out);
soundOn=false;
} else {
println("play");
time.reset();
bitCrush.patch(out);
playDrum();
soundOn=true;
}
} else { // go back to scene 1 (home)
println("go back");
player=minim.loadFile("dialupSound.mp3");
player.pause();
player.rewind();
bitCrush.unpatch(out);
out.close();
soundOn=false;
scene=1;
time.reset();
}
break;
}
}
void stop()
{
// always close Minim audio classes when you are done with them
out.close();
player.close();
minim.stop();
super.stop();
}
class KickInstrument implements Instrument {}
class SnareInstrument implements Instrument {}
class Timer {}
To explain a bit more: this piece of code has 3 scenes. At the 3 scene the sound should be produced. So, when going back to scene 1 the sound should be removed. In this whole project, there are other classes as well, which are SineInstrument, Gain, but they are not listed below. The SineInstrument has no problem at this time. I use out.pauseNote(); to stop it. In all Kick, and Sine class of instrument at void notenf(){} I add the any oscill class a .reset(); into the function.
like this:
void noteOn(float dur) {
// patch our oscil to the summer we were given and start the line
sineOsc.reset();
freqLine.activate();
sineOsc.patch(gain2).patch(out);
}
Is there a way to I stop the noise when it is not playing anything!? Is it possible that if you change .setTempo() it might be the one causing this problem? (In my code, tempo has been changed over time.)