Temperaments: class interface and code begin
This commit is contained in:
parent
23f19151d0
commit
8a43de5b5b
7 changed files with 246 additions and 5 deletions
|
@ -10,13 +10,15 @@ SOURCES += \
|
||||||
src/Tuner.cpp \
|
src/Tuner.cpp \
|
||||||
src/audio/LinearFilter.cpp \
|
src/audio/LinearFilter.cpp \
|
||||||
src/audio/ZeroCross.cpp \
|
src/audio/ZeroCross.cpp \
|
||||||
src/scale/Scale.cpp
|
src/scale/Scale.cpp \
|
||||||
|
src/scale/Temperaments.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/Tuner.hpp \
|
src/Tuner.hpp \
|
||||||
src/audio/LinearFilter.hpp \
|
src/audio/LinearFilter.hpp \
|
||||||
src/audio/ZeroCross.hpp \
|
src/audio/ZeroCross.hpp \
|
||||||
src/scale/Scale.hpp
|
src/scale/Scale.hpp \
|
||||||
|
src/scale/Temperaments.hpp
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
qml/desktop.qrc
|
qml/desktop.qrc
|
||||||
|
|
87
data/Temperaments.csv
Normal file
87
data/Temperaments.csv
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
Werckmeister III;263.40;277.50;294.33;312.18;330.00;351.21;369.99;393.77;416.24;440.00;468.27;495.00
|
||||||
|
Kirnberger I;264.00;278.12;297.00;312.89;330.00;352.00;371.25;396.00;417.19;440.00;469.33;495.00
|
||||||
|
Kirnberger II;262.36;276.40;295.16;310.95;327.95;349.81;368.94;393.54;414.59;440.00;466.42;491.93
|
||||||
|
Kirnberger III;263.18;277.26;294.25;311.92;328.98;350.91;370.10;393.55;415.89;440.00;467.88;493.47
|
||||||
|
Kirnberger III unequal;263.10;277.18;294.50;311.82;328.88;350.80;369.98;393.80;415.76;440.00;467.73;493.31
|
||||||
|
Kelletat;262.82;276.97;294.33;311.49;328.65;350.43;369.29;393.81;415.32;440.00;467.24;492.39
|
||||||
|
Kellner;262.87;276.93;294.13;311.55;329.11;350.49;369.24;393.24;415.40;440.00;467.32;493.66
|
||||||
|
Billeter;262.40;276.71;294.50;311.29;328.70;350.20;368.95;393.10;415.07;440.00;466.93;492.50
|
||||||
|
Equal temperature;261.63;277.18;293.66;311.13;329.63;349.23;369.99;392.00;415.30;440.00;466.16;493.88
|
||||||
|
Lehman 1/6 Pyth.;262.53;277.82;294.00;311.85;329.25;350.85;370.42;392.90;416.27;440.00;467.24;493.88
|
||||||
|
Lehman 1/6 Synt.;262.35;277.89;293.94;311.92;329.32;350.52;370.51;392.72;416.36;440.00;467.35;494.00
|
||||||
|
Fritz (1756 - Equal Beat);261.76;277.33;293.73;311.25;329.70;349.41;370.17;392.04;415.39;440.00;466.27;493.96
|
||||||
|
Pythagoras H.A. van ZWOLLE;260.74;274.69;293.33;309.03;330.00;347.65;366.25;391.11;412.03;440.00;463.54;495.00
|
||||||
|
Meantone;263.18;275.00;294.25;314.84;328.98;352.00;367.81;393.55;411.22;440.00;470.79;491.93
|
||||||
|
GRMMATEUS / Von WIESE-i-A;260.74;276.56;293.33;311.13;330.00;347.65;368.74;391.11;414.84;440.00;466.69;495.03
|
||||||
|
Von WIESE-II-d;262.51;276.56;293.33;311.13;330.00;350.02;368.74;391.11;414.84;440.00;466.69;491.61
|
||||||
|
Von WIESE-II-b;262.51;276.56;295.33;311.13;327.77;350.02;368.74;393.77;414.84;440.00;466.69;491.61
|
||||||
|
BENDELER-I;263.11;277.18;293.33;311.83;330.00;350.81;369.58;392.88;415.77;440.00;467.75;495.03
|
||||||
|
YOUNG / Van BIEZEN;262.51;276.56;294.00;311.13;329.26;350.02;368.74;392.88;414.84;440.00;466.69;492.74
|
||||||
|
ASSELIN;262.07;277.03;293.83;311.65;329.44;350.02;369.37;392.44;415.54;440.00;467.48;493.31
|
||||||
|
RAMIS de PAREJA;264.00;278.44;293.33;312.89;330.00;352.00;371.25;396.00;417.19;440.00;469.33;495.03
|
||||||
|
AGRICOLA;260.74;275.00;293.33;309.38;330.00;347.65;366.67;391.11;412.50;440.00;463.54;495.03
|
||||||
|
BARCA;262.37;276.71;293.94;311.30;329.32;349.82;368.95;392.73;415.07;440.00;466.43;492.91
|
||||||
|
NEIDHARDT-1 d-1724 ks-1732;262.51;277.18;294.00;311.48;329.26;350.02;369.58;392.88;415.77;440.00;466.69;493.31
|
||||||
|
NEIDHARDT 2 ks-1724 GS-1732;262.51;277.50;294.00;311.83;329.63;350.41;370.41;392.88;415.77;440.00;467.75;494.45
|
||||||
|
NEIDHARDT-3 GS-1724;262.51;277.50;294.00;311.83;329.63;350.02;370.41;392.88;415.77;440.00;467.22;494.45
|
||||||
|
NEIDHARDT-4 d-1732;262.51;277.18;294.33;311.48;328.88;350.02;369.58;393.33;415.30;440.00;467.22;493.31
|
||||||
|
SALINAS;264.00;273.86;294.55;316.80;328.64;353.46;366.67;394.36;409.10;440.00;473.24;490.90
|
||||||
|
ROSSI / SAUVEUR Middentoon;262.69;275.68;294.06;313.67;329.18;351.13;368.49;393.06;412.50;440.00;469.33;492.55
|
||||||
|
ROMIEU;262.37;276.14;293.94;312.89;329.32;350.54;368.95;392.74;413.37;440.00;468.38;492.97
|
||||||
|
GABLER (Weingarten ±1750);262.69;275.90;294.00;313.29;329.25;350.85;368.93;393.13;413.39;440.00;468.86;492.46
|
||||||
|
SILBERMANN;262.52;275.94;294.00;313.25;329.27;350.83;368.76;392.88;412.98;440.00;468.81;492.77
|
||||||
|
DUPONT / SCHLICK;263.19;275.00;294.26;314.85;330.89;352.00;367.82;393.56;416.15;440.00;470.79;491.95
|
||||||
|
LAMBERT / CHAUMONT;263.18;275.00;294.25;311.34;328.98;352.00;367.81;393.55;411.22;440.00;468.17;491.93
|
||||||
|
CORRETTE;263.19;275.00;294.26;312.89;328.98;352.00;367.82;393.56;412.51;440.00;469.35;491.95
|
||||||
|
ANON. De CAEN;263.19;275.00;294.26;311.92;328.98;352.00;367.82;393.56;413.80;440.00;469.35;491.95
|
||||||
|
VINCENT;263.19;275.00;294.26;309.60;328.98;350.04;367.82;393.56;411.22;440.00;465.57;491.95
|
||||||
|
RAMEAU;263.18;276.71;294.25;312.58;328.98;352.00;368.95;393.55;415.07;440.00;470.79;491.93
|
||||||
|
RAMEAU-MERCADIER;263.18;275.00;294.25;310.57;328.98;350.91;367.81;393.55;411.99;440.00;467.30;491.93
|
||||||
|
MARPURG;263.18;276.31;294.25;311.87;328.98;352.00;367.81;393.55;415.14;440.00;468.57;491.93
|
||||||
|
LEGROS (3 R.T.);263.18;275.86;294.25;311.13;328.98;350.91;367.81;393.55;413.78;440.00;467.88;491.93
|
||||||
|
LEGROS (2 R.T.);263.18;276.71;294.25;311.30;328.98;350.91;368.95;393.55;415.07;440.00;467.88;491.93
|
||||||
|
d'ALEMBERT / ROUSSEAU;263.19;276.64;294.26;311.13;328.98;350.62;369.27;393.56;414.49;440.00;467.11;492.91
|
||||||
|
de BETHISY;263.19;276.64;294.26;310.88;328.98;350.52;369.27;393.56;414.49;440.00;466.84;492.91
|
||||||
|
VOGEL;262.87;276.18;294.12;311.54;329.11;351.43;368.25;393.24;414.27;440.00;468.59;492.32
|
||||||
|
WERCKMEISTER IV;263.11;275.93;294.66;311.83;330.00;350.81;369.58;392.88;413.90;440.00;469.86;492.77
|
||||||
|
WERCKMEISTER V;261.63;276.56;294.33;311.13;328.88;350.02;369.99;392.44;413.43;440.00;466.69;493.33
|
||||||
|
MARPURG (3);260.74;271.60;293.33;312.89;325.93;347.65;366.67;391.11;407.41;440.00;463.54;488.89
|
||||||
|
KEPLER / MARPURG (2);260.74;275.00;293.33;312.89;325.93;347.65;366.67;391.11;412.50;440.00;469.33;488.89
|
||||||
|
WERCKMEISTER-VI;262.76;276.81;292.77;312.03;329.99;350.34;370.53;393.38;415.23;440.00;468.03;495.00
|
||||||
|
OTHEL / NIEDERBOBRITZSCH;261.63;276.86;294.09;310.77;329.44;349.93;370.10;391.77;414.83;440.00;466.57;492.17
|
||||||
|
GEIB / NEU-BAMBERG;262.53;276.70;294.34;313.11;328.68;350.85;368.08;393.81;412.91;440.00;469.14;492.17
|
||||||
|
VON WIESE-II-a;260.74;274.69;293.33;309.03;330.00;347.65;368.74;391.11;412.03;440.00;463.54;495.00
|
||||||
|
VON WIESE-II-c;260.74;276.56;293.33;311.13;330.00;347.65;368.74;391.11;414.84;440.00;463.54;495.00
|
||||||
|
BENDELER-II;263.40;277.50;294.33;312.18;330.00;351.21;371.25;393.77;416.24;440.00;468.27;495.00
|
||||||
|
BENDELER-III;262.51;277.50;293.33;311.13;330.00;350.02;369.99;392.44;416.24;440.00;466.69;493.33
|
||||||
|
SIEVERS;263.11;277.18;294.66;311.83;329.26;350.81;369.58;393.77;415.77;440.00;467.75;492.77
|
||||||
|
VALLOTTI - TARTINI;262.51;277.18;294.00;311.83;329.26;350.81;369.58;392.88;415.77;440.00;467.75;492.77
|
||||||
|
BARNES;262.51;277.18;294.00;311.83;329.26;350.81;369.58;392.88;415.77;440.00;467.75;493.88
|
||||||
|
LAMBERT;262.26;276.83;293.90;311.43;329.36;350.36;369.10;392.63;415.24;440.00;467.14;493.09
|
||||||
|
SCHIASSI;264.00;278.44;297.00;313.24;330.00;352.00;371.25;396.00;417.66;440.00;469.33;495.00
|
||||||
|
MICHELIN;261.04;275.00;293.66;309.38;330.00;348.05;371.25;391.55;412.50;440.00;464.06;495.00
|
||||||
|
STANHOPE;262.91;277.13;294.55;311.77;328.64;350.55;369.51;394.36;415.70;440.00;467.39;492.95
|
||||||
|
BARCA - interpr. DEVIE;262.37;277.29;293.94;311.95;329.32;350.55;369.72;392.73;415.93;440.00;467.39;492.95
|
||||||
|
SORGE 1744;262.51;277.18;294.00;311.83;330.00;350.02;369.99;392.88;415.77;440.00;467.22;493.88
|
||||||
|
SORGE 1758;262.51;277.50;294.00;311.83;329.63;350.02;370.41;392.88;416.24;440.00;467.22;494.44
|
||||||
|
YOUNG;262.51;277.18;294.00;311.83;329.26;350.41;369.58;392.88;415.77;440.00;467.75;493.33
|
||||||
|
MERCADIER;262.51;277.10;294.00;311.48;329.26;350.41;369.79;392.88;415.30;440.00;467.22;493.47
|
||||||
|
MIDDENTOON -2/7 C;263.53;274.51;294.38;315.68;328.83;352.63;367.32;393.90;410.31;440.00;471.84;491.50
|
||||||
|
MIDDENTOON -1/7 C;262.13;276.47;293.85;312.33;329.41;350.13;369.28;392.50;413.97;440.00;467.67;493.25
|
||||||
|
MIDDENTOON -1/8 C;261.96;276.71;293.79;311.92;329.49;349.82;369.52;392.33;414.43;440.00;467.15;493.47
|
||||||
|
MIDDENTOON -1/9 C;261.82;276.90;293.74;311.60;329.54;349.58;369.72;392.19;414.78;440.00;466.75;493.64
|
||||||
|
WEINGARTEN;262.38;277.18;293.50;312.21;329.44;350.04;369.14;392.68;416.02;440.00;467.78;492.74
|
||||||
|
RAMEAU in C;263.18;275.00;294.25;309.38;328.98;349.47;367.81;393.55;412.50;440.00;464.06;491.93
|
||||||
|
RAMEAU in F;263.18;275.86;294.25;310.34;328.98;352.00;367.81;393.55;413.78;440.00;467.42;491.93
|
||||||
|
RAMEAU volg. KLOP;263.18;276.71;294.25;310.34;328.98;352.00;368.95;393.55;415.07;440.00;467.42;491.93
|
||||||
|
RAMEAU volg. TLA;263.37;276.54;294.34;311.13;328.87;352.37;368.71;393.81;414.83;440.00;468.32;491.61
|
||||||
|
VOGEL (STADE);262.87;277.68;294.13;311.55;329.11;351.44;369.24;393.24;415.40;440.00;467.32;492.32
|
||||||
|
LOUET;262.69;276.37;294.06;311.71;329.18;351.13;368.95;393.06;414.04;440.00;469.33;492.55
|
||||||
|
SALOMON de CAUS;264.00;275.00;293.33;309.38;330.00;352.00;371.25;396.00;412.50;440.00;464.06;495.00
|
||||||
|
MARPURG (1) ZARLINO;264.00;275.00;297.00;316.80;330.00;352.00;371.25;396.00;412.50;440.00;475.20;495.00
|
||||||
|
MARPURG (4) LOULIE;264.00;275.00;293.33;316.80;330.00;352.00;366.67;396.00;412.50;440.00;475.20;495.00
|
||||||
|
FOGLIANO;264.00;275.00;293.33;316.80;330.00;352.00;366.67;396.00;412.50;440.00;469.33;495.00
|
||||||
|
Malcolm (vlg. Kelletat);264.00;280.50;297.00;313.50;330.00;352.00;374.00;396.00;418.00;440.00;467.50;495.00
|
||||||
|
Anoniem (vlg. Kelletat);260.74;271.60;293.33;305.56;325.93;347.65;366.67;391.11;407.41;440.00;463.54;488.89
|
||||||
|
Euler (vlg. Kelletat);264.00;275.00;297.00;309.38;330.00;352.00;371.25;396.00;412.50;440.00;464.06;495.00
|
||||||
|
Mattheson (vlg. Kelletat);264.00;275.00;297.00;309.38;330.00;352.00;371.25;396.00;412.50;440.00;475.20;495.00
|
|
|
@ -14,10 +14,12 @@ SOURCES += \
|
||||||
src/Tuner.cpp \
|
src/Tuner.cpp \
|
||||||
src/audio/LinearFilter.cpp \
|
src/audio/LinearFilter.cpp \
|
||||||
src/audio/ZeroCross.cpp \
|
src/audio/ZeroCross.cpp \
|
||||||
src/scale/Scale.cpp
|
src/scale/Scale.cpp \
|
||||||
|
src/scale/Temperaments.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/Tuner.hpp \
|
src/Tuner.hpp \
|
||||||
src/audio/LinearFilter.hpp \
|
src/audio/LinearFilter.hpp \
|
||||||
src/audio/ZeroCross.hpp \
|
src/audio/ZeroCross.hpp \
|
||||||
src/scale/Scale.hpp
|
src/scale/Scale.hpp \
|
||||||
|
src/scale/Temperaments.hpp
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "Scale.hpp"
|
#include "Scale.hpp"
|
||||||
|
|
||||||
const char * Scale::noteNames[] = {
|
const char * Scale::noteNames[] = {
|
||||||
|
@ -114,6 +116,12 @@ double Scale::GetLa()
|
||||||
return actualLa;
|
return actualLa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scale::SetNotesFrequencies(double freq[nbNote])
|
||||||
|
{
|
||||||
|
memcpy(noteFreq, freq, sizeof(double) * nbNote);
|
||||||
|
updateScale();
|
||||||
|
}
|
||||||
|
|
||||||
void Scale::SetLa(double la)
|
void Scale::SetLa(double la)
|
||||||
{
|
{
|
||||||
assert(la > 0);
|
assert(la > 0);
|
||||||
|
|
|
@ -51,6 +51,9 @@ class Scale {
|
||||||
|
|
||||||
void ConstructEqualTemperament();
|
void ConstructEqualTemperament();
|
||||||
|
|
||||||
|
/// Set notes frequencies from a temperament
|
||||||
|
void SetNotesFrequencies(double freq[nbNote]);
|
||||||
|
|
||||||
double GetLa();
|
double GetLa();
|
||||||
void SetLa(double la);
|
void SetLa(double la);
|
||||||
|
|
||||||
|
@ -59,7 +62,6 @@ class Scale {
|
||||||
*/
|
*/
|
||||||
int FindNote(double freq, int &octave, double &deviation);
|
int FindNote(double freq, int &octave, double &deviation);
|
||||||
|
|
||||||
|
|
||||||
static const char * NoteName(int note);
|
static const char * NoteName(int note);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
76
src/scale/Temperaments.cpp
Normal file
76
src/scale/Temperaments.cpp
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
/* Copyright 2016 (C) Louis-Joseph Fournier
|
||||||
|
* louisjoseph.fournier@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of SailTuner.
|
||||||
|
*
|
||||||
|
* SailTuner is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* SailTuner 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include "Temperaments.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
Temperaments::Temperaments(const char * dirname) : current(0)
|
||||||
|
{
|
||||||
|
GetDir(dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Temperaments::GetDir(const char * dirname)
|
||||||
|
{
|
||||||
|
DIR *pdir = opendir(dirname);
|
||||||
|
struct dirent *pent = NULL;
|
||||||
|
struct stat filestat;
|
||||||
|
string filepath;
|
||||||
|
|
||||||
|
if (!pdir) {
|
||||||
|
cerr << __func__ << ": impossible to open dir " << dirname << endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while((pent = readdir(pdir))) {
|
||||||
|
// get only files
|
||||||
|
if (pent->d_name[0] == '.') continue;
|
||||||
|
filepath = dirname;
|
||||||
|
filepath += "/";
|
||||||
|
filepath += pent->d_name;
|
||||||
|
if (stat(filepath.c_str(), &filestat )) continue;
|
||||||
|
if (S_ISDIR( filestat.st_mode )) continue;
|
||||||
|
|
||||||
|
CheckFile(filepath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Temperaments::CheckFile(string filename)
|
||||||
|
{
|
||||||
|
cout << __func__ << " " << filename << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Temperaments::GetCurrentName() const
|
||||||
|
{
|
||||||
|
if (current >= list.size()) return "";
|
||||||
|
return list[current].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Temperaments::GetName(unsigned int n) const
|
||||||
|
{
|
||||||
|
if (n < list.size()) return "";
|
||||||
|
return list[n].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
const double * Temperaments::NotesFrequencies() const
|
||||||
|
{
|
||||||
|
return notes;
|
||||||
|
}
|
64
src/scale/Temperaments.hpp
Normal file
64
src/scale/Temperaments.hpp
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/* Copyright 2016 (C) Louis-Joseph Fournier
|
||||||
|
* louisjoseph.fournier@gmail.com
|
||||||
|
*
|
||||||
|
* This file is part of SailTuner.
|
||||||
|
*
|
||||||
|
* SailTuner is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* SailTuner 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TEMPERAMENTS_HPP
|
||||||
|
#define __TEMPERAMENTS_HPP
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Temperament management
|
||||||
|
*
|
||||||
|
* Check temperaments in files in a dir
|
||||||
|
* Get list and temperements
|
||||||
|
*/
|
||||||
|
class Temperaments {
|
||||||
|
private:
|
||||||
|
/// describe internal a temperament
|
||||||
|
struct temp_t {
|
||||||
|
std::string name; ///< temperament name
|
||||||
|
std::string file; ///< file name
|
||||||
|
int seek; ///< position in file
|
||||||
|
};
|
||||||
|
|
||||||
|
static const int nb_notes = 12;
|
||||||
|
|
||||||
|
unsigned int current;
|
||||||
|
std::vector<temp_t> list;
|
||||||
|
double notes[nb_notes];
|
||||||
|
|
||||||
|
void GetDir(const char *dirname);
|
||||||
|
void CheckFile(std::string filename);
|
||||||
|
void GetTemperament(const temp_t temperament);
|
||||||
|
|
||||||
|
public:
|
||||||
|
/// constructor with dir name to find data files
|
||||||
|
Temperaments(const char * dirname);
|
||||||
|
~Temperaments();
|
||||||
|
|
||||||
|
/// set current temperament
|
||||||
|
bool SetTemperament(std::string name);
|
||||||
|
/// get the name of current temperament
|
||||||
|
std::string GetCurrentName() const;
|
||||||
|
/// get the name of temperament number n
|
||||||
|
std::string GetName(unsigned int n) const;
|
||||||
|
/// get notes frequencies as double[nb_notes]
|
||||||
|
const double * NotesFrequencies() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue