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/audio/LinearFilter.cpp \
|
||||
src/audio/ZeroCross.cpp \
|
||||
src/scale/Scale.cpp
|
||||
src/scale/Scale.cpp \
|
||||
src/scale/Temperaments.cpp
|
||||
|
||||
HEADERS += \
|
||||
src/Tuner.hpp \
|
||||
src/audio/LinearFilter.hpp \
|
||||
src/audio/ZeroCross.hpp \
|
||||
src/scale/Scale.hpp
|
||||
src/scale/Scale.hpp \
|
||||
src/scale/Temperaments.hpp
|
||||
|
||||
RESOURCES += \
|
||||
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/audio/LinearFilter.cpp \
|
||||
src/audio/ZeroCross.cpp \
|
||||
src/scale/Scale.cpp
|
||||
src/scale/Scale.cpp \
|
||||
src/scale/Temperaments.cpp
|
||||
|
||||
HEADERS += \
|
||||
src/Tuner.hpp \
|
||||
src/audio/LinearFilter.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 <math.h>
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
|
||||
#include "Scale.hpp"
|
||||
|
||||
const char * Scale::noteNames[] = {
|
||||
|
@ -114,6 +116,12 @@ double Scale::GetLa()
|
|||
return actualLa;
|
||||
}
|
||||
|
||||
void Scale::SetNotesFrequencies(double freq[nbNote])
|
||||
{
|
||||
memcpy(noteFreq, freq, sizeof(double) * nbNote);
|
||||
updateScale();
|
||||
}
|
||||
|
||||
void Scale::SetLa(double la)
|
||||
{
|
||||
assert(la > 0);
|
||||
|
|
|
@ -51,6 +51,9 @@ class Scale {
|
|||
|
||||
void ConstructEqualTemperament();
|
||||
|
||||
/// Set notes frequencies from a temperament
|
||||
void SetNotesFrequencies(double freq[nbNote]);
|
||||
|
||||
double GetLa();
|
||||
void SetLa(double la);
|
||||
|
||||
|
@ -59,7 +62,6 @@ class Scale {
|
|||
*/
|
||||
int FindNote(double freq, int &octave, double &deviation);
|
||||
|
||||
|
||||
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