Import upstream version 0.99.2
[fmit.git] / libs / Music / ScoreGenerator.cpp
diff --git a/libs/Music/ScoreGenerator.cpp b/libs/Music/ScoreGenerator.cpp
new file mode 100644 (file)
index 0000000..2d4d95c
--- /dev/null
@@ -0,0 +1,95 @@
+// Copyright 2004 "Gilles Degottex"
+
+// This file is part of "Music"
+
+// "Music" is free software; you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation; either version 2.1 of the License, or
+// (at your option) any later version.
+// 
+// "Music" is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+#include "ScoreGenerator.h"
+
+#include <iostream>
+//#include <fstream>
+//#include <sstream>
+//#include <deque>
+using namespace std;
+
+#include <CppAddons/Math.h>
+//#include <CppAddons/String.h>
+//using namespace String;
+#include <CppAddons/Random.h>
+
+#include "Music.h"
+
+namespace Music
+{
+
+void GenerateScore(    vector<double>& buffer,                 // the score's wav
+                               vector< vector<int> >& score,   // the score
+                               double lenght,                                  // lenght of the score in seconds       : R+*
+                               int dataBySecond,                               // number of data by second                     : ~{11000, 22000, 44100}
+                               double AFreq,                                   // frequency of A                                       : ~440.0
+                               int minHT,                                              // minimum halftone                                     : Z             // TODO <0
+                               int maxHT,                                              // maximum halftone                                     : Z
+                               int nbNotes,                                    // number of notes in lenght            : N*
+                               int nbVoice)                                    // number of voices                                     : N*
+{
+       static Random rdm;
+
+       int size = int(lenght*dataBySecond);
+       int nbHT = maxHT-minHT+1;
+       int note_size = size / nbNotes;
+       cout << "AFreq=" << AFreq << " dataBySecond=" << dataBySecond << endl;
+       cout << "nbNotes=" << nbNotes << " lenght=" << lenght << " minHT=" << minHT << " maxHT=" << maxHT << endl;
+       cout << "size=" << size << " nbHT=" << nbHT << " nbVoice=" << nbVoice << endl;
+
+       cout << "make score ... \t\t" << flush;
+//     int n=0;
+       for(int i=0; i<nbNotes; i++)
+       {
+               vector<int> hs(nbVoice);
+               for(size_t v=0; v<hs.size(); v++)
+                       hs[v] = minHT+rdm.nextInt(maxHT-minHT+1);
+
+//             cout << "halftone selected=" << h << " freq=" << freq << endl;
+               for(int j=0; j<note_size; j++)
+               {
+                       double buff = 0.0;
+                       for(size_t v=0; v<hs.size(); v++)
+                               buff += sin( ((2.0*Math::Pi)/dataBySecond)*h2f(hs[v], AFreq)*double(j) );
+
+//                     int index = i*note_size+j;
+                       // add data index and wav value
+       
+                       buffer.push_back(buff);
+                       // add score halftones (solution)
+                       vector<int> score_at(nbHT);
+                       for(int vh=0; vh<nbHT; vh++)
+                       {
+                               int ampl = 0;
+                               for(size_t v=0; v<hs.size(); v++)
+                                       if(hs[v]==vh+minHT)
+                                               ampl++;
+                               score_at[vh] = ampl;
+                       }
+                       score.push_back(score_at);
+//                     n = undoable_out_percent(cout, 100.0f*index/size, n);
+               }
+       }
+//     undoable_out_clear(cout, n);
+       cout << "done   " << endl;
+}
+
+}
+