cannam@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
cannam@0
|
2
|
cannam@0
|
3 /*
|
cannam@0
|
4 QM DSP Library
|
cannam@0
|
5
|
cannam@0
|
6 Centre for Digital Music, Queen Mary, University of London.
|
cannam@0
|
7 This file copyright 2006 Martin Gasser.
|
cannam@0
|
8 All rights reserved.
|
cannam@0
|
9 */
|
cannam@0
|
10
|
cannam@0
|
11 #include "TonalEstimator.h"
|
cannam@0
|
12
|
cannam@0
|
13 #include <cmath>
|
cannam@0
|
14 #include <iostream>
|
cannam@0
|
15
|
cannam@0
|
16 #ifndef PI
|
cannam@0
|
17 #define PI (3.14159265358979232846)
|
cannam@0
|
18 #endif
|
cannam@0
|
19
|
cannam@0
|
20 TonalEstimator::TonalEstimator()
|
cannam@0
|
21 {
|
cannam@0
|
22 m_Basis.resize(6);
|
cannam@0
|
23
|
cannam@0
|
24 int i = 0;
|
cannam@0
|
25
|
cannam@0
|
26
|
cannam@0
|
27 // circle of fifths
|
cannam@0
|
28 m_Basis[i].resize(12);
|
cannam@0
|
29 for (int iP = 0; iP < 12; iP++)
|
cannam@0
|
30 {
|
cannam@0
|
31 m_Basis[i][iP] = std::sin( (7.0 / 6.0) * iP * PI);
|
cannam@0
|
32 }
|
cannam@0
|
33
|
cannam@0
|
34 i++;
|
cannam@0
|
35
|
cannam@0
|
36 m_Basis[i].resize(12);
|
cannam@0
|
37 for (int iP = 0; iP < 12; iP++)
|
cannam@0
|
38 {
|
cannam@0
|
39 m_Basis[i][iP] = std::cos( (7.0 / 6.0) * iP * PI);
|
cannam@0
|
40 }
|
cannam@0
|
41
|
cannam@0
|
42 i++;
|
cannam@0
|
43
|
cannam@0
|
44
|
cannam@0
|
45 // circle of major thirds
|
cannam@0
|
46 m_Basis[i].resize(12);
|
cannam@0
|
47 for (int iP = 0; iP < 12; iP++)
|
cannam@0
|
48 {
|
cannam@0
|
49 m_Basis[i][iP] = 0.6 * std::sin( (2.0 / 3.0) * iP * PI);
|
cannam@0
|
50 }
|
cannam@0
|
51
|
cannam@0
|
52 i++;
|
cannam@0
|
53
|
cannam@0
|
54 m_Basis[i].resize(12);
|
cannam@0
|
55 for (int iP = 0; iP < 12; iP++)
|
cannam@0
|
56 {
|
cannam@0
|
57 m_Basis[i][iP] = 0.6 * std::cos( (2.0 / 3.0) * iP * PI);
|
cannam@0
|
58 }
|
cannam@0
|
59
|
cannam@0
|
60 i++;
|
cannam@0
|
61
|
cannam@0
|
62
|
cannam@0
|
63 // circle of minor thirds
|
cannam@0
|
64 m_Basis[i].resize(12);
|
cannam@0
|
65 for (int iP = 0; iP < 12; iP++)
|
cannam@0
|
66 {
|
cannam@0
|
67 m_Basis[i][iP] = 1.1 * std::sin( (3.0 / 2.0) * iP * PI);
|
cannam@0
|
68 }
|
cannam@0
|
69
|
cannam@0
|
70 i++;
|
cannam@0
|
71
|
cannam@0
|
72 m_Basis[i].resize(12);
|
cannam@0
|
73 for (int iP = 0; iP < 12; iP++)
|
cannam@0
|
74 {
|
cannam@0
|
75 m_Basis[i][iP] = 1.1 * std::cos( (3.0 / 2.0) * iP * PI);
|
cannam@0
|
76 }
|
cannam@0
|
77
|
cannam@0
|
78 }
|
cannam@0
|
79
|
cannam@0
|
80 TonalEstimator::~TonalEstimator()
|
cannam@0
|
81 {
|
cannam@0
|
82 }
|
cannam@0
|
83
|
cannam@0
|
84 TCSVector TonalEstimator::transform2TCS(const ChromaVector& rVector)
|
cannam@0
|
85 {
|
cannam@0
|
86 TCSVector vaRetVal;
|
cannam@0
|
87 vaRetVal.resize(6, 0.0);
|
cannam@0
|
88
|
cannam@0
|
89 for (int i = 0; i < 6; i++)
|
cannam@0
|
90 {
|
cannam@0
|
91 for (int iP = 0; iP < 12; iP++)
|
cannam@0
|
92 {
|
cannam@0
|
93 vaRetVal[i] += m_Basis[i][iP] * rVector[iP];
|
cannam@0
|
94 }
|
cannam@0
|
95 }
|
cannam@0
|
96
|
cannam@0
|
97 return vaRetVal;
|
cannam@0
|
98 }
|