summaryrefslogtreecommitdiffstats
path: root/Processing-js/Synthe3000.pde
diff options
context:
space:
mode:
Diffstat (limited to 'Processing-js/Synthe3000.pde')
-rw-r--r--Processing-js/Synthe3000.pde198
1 files changed, 198 insertions, 0 deletions
diff --git a/Processing-js/Synthe3000.pde b/Processing-js/Synthe3000.pde
new file mode 100644
index 0000000..97f205a
--- /dev/null
+++ b/Processing-js/Synthe3000.pde
@@ -0,0 +1,198 @@
+/* @pjs preload="PartitionLune.png"; */
+
+void calcScore()
+{
+ score = 0;
+ float tmpScore = 0;
+ for (int i=0; i<=numnote; i++) // Pour chaque note cliquée
+ {
+ for (int j=0; j < tmpNotes.length; j++) // La comparer à chaque note de la partition
+ {
+ if (notePressed[i][0] != tmpNotes[j][0]) // Si la note est différente
+ continue; // Passer à la note suivante
+ if(i == 0 && j == 0) // Si c'est la toute première note
+ tmpScore = 1; // Donner d'office un score de 1000
+ if(i == 0 || j == 0) // Si on est à la première note d'un des deux tableaux
+ continue; // Passer à la note suivante
+ float deltaTime = sqrt(abs((notePressed[i][1]-notePressed[i-1][1]) - (tmpNotes[j][1]-tmpNotes[j-1][1]))); // Calcul de la différence de durée de la note de la partition et de la note cliquée passé à la racine carrée pour donner un résultat plus adapté
+ if (deltaTime == 0) // Si les notes ont exactement la même durée
+ tmpScore = 1; // Donner un score de 1000
+ else if (1/((float)deltaTime) > tmpScore) // Si le score est le plus élevé pour une note cliquée comparée à plusieurs note de la partition
+ tmpScore = 1/((float)deltaTime); // Enregistrer ce score (l'inverse, puisque que plus la différence de temps est grande, moins le score est important)
+ }
+ score += tmpScore*1000;
+ tmpScore = 0;
+ }
+}
+
+void setup() {
+ PartitionLune = loadImage(imagePartition); // Charge l'image de la partition
+ initSynth();
+ defineKeys();
+ size(1130,650);
+ background(255);
+ PFont myFont = createFont("Boingo", 32);
+ textFont(myFont);
+ drawKeyboard();
+ drawDisplay();
+ dimage(PartitionLune, imageCoordinates[0], imageCoordinates[1], imageSize[0], imageSize[1]);
+}
+
+void draw() {
+
+ if (events[MOUSEPRESSED] || events[KEYPRESSED]) // Si un clic a eu lieu, mettre à jour
+ {
+ playNotes();
+ drawKeyboard();
+ drawDisplay();
+ }
+ else if (events[MUSICSTARTED]) // Ou si la musique est lancée
+ {
+
+ if (events[MUSICFINISHED])
+ {
+ events[MUSICSTARTED] = false;
+ events[MUSICFINISHED] = false;
+ drawDisplay();
+ }
+ else
+ {
+ playNotes();
+ drawKeyboard();
+ }
+ }
+ if (events[RECORDINGSTARTED])
+ {
+ if (events[RECORDINGSTOPPED])
+ {
+ events[RECORDINGSTARTED] = false;
+ notePressed[0][1] = 0;
+ calcScore();
+ numnote = 0;
+ drawDisplay();
+ }
+ }
+ events[MOUSEPRESSED] = false;
+ events[KEYPRESSED] = false;
+ events[PLAYPRESSED] = false;
+}
+
+int whiteKeys() // Détection du clic sur une touche blanche
+{
+ int activatedKey = 0;
+ for (int j=0; j<numOctaves; j++) {
+ for (int i=0; i<7; i++) {
+ float xPos = (keyWidth[1]/numOctaves)*i+(float)j/numOctaves;
+ if ((mouseX >= xPos*windowSize[0]) && (mouseX <= (xPos+(keyWidth[1]/(numOctaves)))*windowSize[0]) && (mouseY <= (keyboardYCoordinate+keyHeight[1])*windowSize[1]))
+ activatedKey = (j*7)+(i+1);
+ }
+ }
+ return activatedKey;
+}
+
+int blackKeys() // Détection du clic sur une touche noire
+{
+ int activatedKey = 0;
+ for (int j=0; j<numOctaves; j++) {
+ // Dessine les touches noires
+ for (int i=0; i<keyXCoordinates.length; i++) {
+ float xPos = (keyXCoordinates[i]/numOctaves)+(float)j/numOctaves;
+ if ((mouseX >= xPos*windowSize[0]) && (mouseX <= (xPos+(keyWidth[0]/(numOctaves)))*windowSize[0]) && (mouseY <= (keyboardYCoordinate+keyHeight[0])*windowSize[1]))
+ activatedKey = (j*5)+(i+1);
+ }
+ }
+ return activatedKey;
+}
+
+void mousePressed() {
+ events[MOUSEPRESSED] = true;
+
+ if (mouseY >= keyboardYCoordinate*windowSize[1]) // Si le clic est effectué au niveau du clavier
+ {
+ int activatedKey = blackKeys();
+
+ if (activatedKey == 0)
+ {
+ activatedKey = whiteKeys();
+ if (activatedKey == 0)
+ return;
+ processNote(activatedKey, true, true, false);
+ }
+ else processNote(activatedKey, false, true, false);
+ }
+ else
+ {
+ if (!events[RECORDINGSTARTED] && sqrt(pow((playButtonCoordinates[0]*windowSize[0] - (float)mouseX), 2) + pow((playButtonCoordinates[1]*windowSize[1] - (float)mouseY), 2)) <= buttonRadius*windowSize[0]) // Si une touche d'un chiffre est cliquée (distance entre le centre du cercle et l'endroit cliqué inférieur au rayon)
+ events[PLAYPRESSED] = true;
+ if (!events[MUSICSTARTED] && sqrt(pow((recordButtonCoordinates[0]*windowSize[0] - (float)mouseX), 2) + pow((recordButtonCoordinates[1]*windowSize[1] - (float)mouseY), 2)) <= buttonRadius*windowSize[0]) // Si une touche d'un chiffre est cliquée (distance entre le centre du cercle et l'endroit cliqué inférieur au rayon)
+ {
+ if (events[RECORDINGSTARTED])
+ events[RECORDINGSTOPPED] = true;
+ else if (events[RECORDINGSTOPPED])
+ {
+ events[RECORDINGSTARTED] = true;
+ events[RECORDINGSTOPPED] = false;
+ score = -1;
+ }
+ else
+ events[RECORDINGSTARTED] = true;
+ }
+ }
+}
+
+void mouseReleased()
+{
+ events[MOUSEPRESSED] = true;
+
+ if (mouseY >= keyboardYCoordinate*windowSize[1]) // Si le clic est effectué au niveau du clavier
+ {
+ int activatedKey = blackKeys();
+
+ if (activatedKey == 0)
+ {
+ activatedKey = whiteKeys();
+ if (activatedKey == 0)
+ return;
+ processNote(activatedKey, true, false, false);
+ }
+ else processNote(activatedKey, false, false, false);
+ }
+}
+
+void keyPressed() {
+ events[KEYPRESSED] = true;
+
+ if (keyCode < 523)
+ {
+ int activatedKey = touchesNoires[keyCode];
+
+ if (activatedKey == 0)
+ {
+ activatedKey = touchesBlanches[keyCode];
+ if (activatedKey == 0)
+ return;
+ processNote(activatedKey, true, true, false);
+ }
+ else processNote(activatedKey, false, true, false);
+ }
+}
+
+void keyReleased()
+{
+ events[KEYPRESSED] = true;
+
+ if (keyCode < 523)
+ {
+ int activatedKey = touchesNoires[keyCode];
+
+ if (activatedKey == 0)
+ {
+ activatedKey = touchesBlanches[keyCode];
+ if (activatedKey == 0)
+ return;
+ processNote(activatedKey, true, false, false);
+ }
+ else processNote(activatedKey, false, false, false);
+ }
+}
+