00001
00022 #ifndef CSOUND_VOICELEAD_HPP
00023 #define CSOUND_VOICELEAD_HPP
00024
00025 #include "Platform.hpp"
00026 #ifdef SWIG
00027 %module CsoundAC
00028 %{
00029 #ifndef TEST
00030 #include "Event.hpp"
00031 #endif
00032 #include <vector>
00033 #include <algorithm>
00034 #include <cmath>
00035 %}
00036 %include "std_vector.i"
00037 %template(ChordVector) std::vector< std::vector<double> >;
00038 #else
00039 #ifndef TEST
00040 #include "Event.hpp"
00041 #endif
00042 #include <vector>
00043 #endif
00044
00045 namespace csound
00046 {
00054 class Voicelead
00055 {
00056 public:
00067 static double pc(double pitch, size_t divisionsPerOctave = 12);
00068
00069
00074 static std::vector<double> voiceleading(const std::vector<double> &chord1,
00075 const std::vector<double> &chord2);
00076
00082 static const std::vector<double> &simpler(const std::vector<double> &source,
00083 const std::vector<double> &destination1,
00084 const std::vector<double> &destination2,
00085 bool avoidParallels);
00086
00091 static double smoothness(const std::vector<double> &chord1,
00092 const std::vector<double> &chord2);
00093
00098 static double euclideanDistance(const std::vector<double> &chord1,
00099 const std::vector<double> &chord2);
00100
00101
00102
00103
00104
00105 static bool areParallel(const std::vector<double> &chord1,
00106 const std::vector<double> &chord2);
00107
00114 static const std::vector<double> &closer(const std::vector<double> &source,
00115 const std::vector<double> &destination1,
00116 const std::vector<double> &destination2,
00117 bool avoidParallels);
00118
00122 static std::vector<double> rotate(const std::vector<double> &chord);
00123
00127 static std::vector< std::vector<double> > rotations(const std::vector<double> &chord);
00128
00135 static std::vector<double> pcs(const std::vector<double> &chord, size_t divisionsPerOctave = 12);
00136
00143 static std::vector<double> uniquePcs(const std::vector<double> &chord, size_t divisionsPerOctave = 12);
00144
00152 static double pitchClassSetToM(const std::vector<double> &chord, size_t divisionsPerOctave = 12);
00153
00158 static std::vector<double> mToPitchClassSet(double pcn, size_t divisionsPerOctave = 12);
00159
00164 static std::vector<double> pitchClassSetToPandT(const std::vector<double> &pcs,
00165 size_t divisionsPerOctave = 12);
00166
00170 static std::vector<double> pAndTtoPitchClassSet(double prime,
00171 double transposition,
00172 size_t divisionsPerOctave = 12);
00173
00180 static const std::vector<double> closest(const std::vector<double> &source,
00181 const std::vector< std::vector<double> > &destinations,
00182 bool avoidParallels);
00183
00196 static std::vector<double> voicelead(const std::vector<double> &source,
00197 const std::vector<double> &targetPitchClassSet,
00198 double lowest,
00199 double range,
00200 bool avoidParallels,
00201 size_t divisionsPerOctave = 12);
00202
00215 static std::vector<double> recursiveVoicelead(const std::vector<double> &source,
00216 const std::vector<double> &targetPitchClassSet,
00217 double lowest,
00218 double range,
00219 bool avoidParallels,
00220 size_t divisionsPerOctave = 12);
00221
00225 static double closestPitch(double pitch, const std::vector<double> &pitches);
00226
00234 static double conformToPitchClassSet(double pitch, const std::vector<double> &pcs, size_t divisionsPerOctave = 12);
00235
00239 static std::vector<double> invert(const std::vector<double> &chord);
00240
00245 static std::vector< std::vector<double> > inversions(const std::vector<double> &chord);
00246
00250 static std::vector<double> toOrigin(const std::vector<double> &chord);
00251
00257 static std::vector<double> normalChord(const std::vector<double> &chord);
00258
00265 static std::vector<double> primeChord(const std::vector<double> &chord);
00266
00272 static double nameToC(std::string name, size_t divisionsPerOctave_);
00273
00280 static double mToC(double M, size_t divisionsPerOctave);
00281
00288 static double cToM(double C, size_t divisionsPerOctaven = 12);
00289
00296 static double cToP(double C, size_t divisionsPerOctave = 12);
00297
00304 static double pToC(double Z, size_t divisionsPerOctave = 12);
00305
00310 static std::vector<double> orderedPcs(const std::vector<double> &chord, size_t divisionsPerOctave = 12);
00311
00315 static std::vector<double> sortByAscendingDistance(const std::vector<double> &chord, size_t divisionsPerOctave = 12);
00316
00328 static std::vector< std::vector<double> > nonBijectiveVoicelead(const std::vector<double> &sourceChord,
00329 const std::vector<double> &targetPitchClassSet,
00330 size_t divisionsPerOctave = 12);
00331
00335 static std::vector<double> pToPrimeChord(double P, size_t divisionsPerOctave = 12);
00336
00337 static void initializePrimeChordsForDivisionsPerOctave(size_t divisionsPerOctave);
00338
00356 static std::vector<double> ptvToChord(size_t P, size_t T, size_t V_, size_t lowest, size_t range, size_t divisionsPerOctave = 12);
00357
00374 static std::vector<double> chordToPTV(const std::vector<double> &chord, size_t lowestPitch, size_t highestPitch, size_t divisionsPerOctave = 12);
00375
00388 static std::vector< std::vector<double> > voicings(const std::vector<double> &chord,
00389 double lowest,
00390 double highest,
00391 size_t divisionsPerOctave);
00402 static bool addOctave(const std::vector<double> &lowestVoicing, std::vector<double> &newVoicing, size_t maximumPitch, size_t divisionsPerOctave);
00403
00407 static std::vector<double> wrap(const std::vector<double> &chord, size_t lowestPitch, size_t highestPitch, size_t divisionsPerOctave = 12);
00408
00412 static std::vector<double> transpose(const std::vector<double> &chord, double semitones);
00413 };
00414 }
00415 #endif
00416