We are about to switch to a new forum software. Until then we have removed the registration on this forum.
Hello everyone,
I have a spreadsheet with the first 1 million numbers in PI. The goal is to have different visuals displayed along with music tones in accordance with the numbers in the chart (0-9). The sound works, however I cannot get the program to show any visuals at the same time. Eg. I want the program to draw an ellipse whenever "0" is read from the .CSV file.
Here is my code:
Table data;
int[] row;
import ddf.minim.*;
Minim minim;
AudioPlayer DO;
AudioPlayer RE;
AudioPlayer MI;
AudioPlayer FA;
AudioPlayer SOL;
AudioPlayer LA;
AudioPlayer TI;
AudioPlayer DOO;
void setup() {
size(500, 500);
background(50);
minim = new Minim(this);
data = loadTable("pi.csv", "header");
DO = minim.loadFile("do.wav");
RE = minim.loadFile("re.wav");
MI = minim.loadFile("mi.wav");
FA = minim.loadFile("fa.wav");
SOL = minim.loadFile("sol.wav");
LA = minim.loadFile("la.wav");
TI = minim.loadFile("ti-WAV.wav");
DOO = minim.loadFile("do-octave.wav");
}
void draw() {
fill(250);
stroke(250);
row = new int[ data.getRowCount()]; //create an array for row
for (TableRow row : data.rows()) {
for (int i=0; i < 10; i++) { // for loop with an increasing "i" allows program go get info through the rows
int A = row.getInt(i); //intA is equal to the number in the row
delay(200);
ellipse(mouseX, mouseY, 100, 50);
if (A==0) {
delay(500);
ellipse(100, 100, 100, 50);
}
if (A==1) {
RE.rewind();
RE.play();
ellipse(200, 200, 50, 50);
}
if (A==2) {
MI.rewind();
MI.play();
}
if (A==3) {
FA.rewind();
FA.play();
}
if (A==4) {
SOL.rewind();
SOL.play();
}
if (A==5) {
LA.rewind();
LA.play();
}
if (A==6) {
TI.rewind();
TI.play();
}
if (A==7) {
DOO.rewind();
DOO.play();
}
if (A==8) {
delay(300);
}
if (A==9) {
DO.rewind();
DO.play();
}
}
}
}
What can I do? Thank you!!
Answers
Your problem is that you have a loop within draw when draw itself is a loop.
Read the thread in Common Questions about setup and draw.
And also the one about many variables to an array because your code is full of unnecessary repetition.
@koogs
Thank you for your response! How would it be possible to read data from a .csv file without using a for loop?
read all the data in setup() (for loop). use a global array. access that array in draw (using a global index counter that increments every frame).
@koogs
Thank you for your response once again, I tried reading all of the data in setup using a for loop and a global array, however, I get the error NullPointerException from the line "datafromtable[d] = row.getInt(i);"
What should I do :-( ???
You need to give datafromtable a size.
That said, I think you might have everything you need in line 8, you can read the data from the table one value at a time in your draw loop using your
datavariable without the need for an array (and certainly not two).Is your csv just one digit per line?
something like
the csv file: