Mercurial > hg > svapp
comparison audioio/ContinuousSynth.cpp @ 315:65b75e23bbd5 tonioni
interpolation, longer crossfades
author | Chris Cannam |
---|---|
date | Wed, 08 Jan 2014 13:41:57 +0000 |
parents | 58582119c92a |
children | 8611eb7be689 |
comparison
equal
deleted
inserted
replaced
314:817ad10f91d1 | 315:65b75e23bbd5 |
---|---|
48 if (!nowOn && !wasOn) { | 48 if (!nowOn && !wasOn) { |
49 m_phase = 0; | 49 m_phase = 0; |
50 return; | 50 return; |
51 } | 51 } |
52 | 52 |
53 int fadeLength = 20; // samples | 53 int fadeLength = 100; // samples |
54 | 54 |
55 float *levels = new float[m_channels]; | 55 float *levels = new float[m_channels]; |
56 | 56 |
57 for (int c = 0; c < m_channels; ++c) { | 57 for (int c = 0; c < m_channels; ++c) { |
58 levels[c] = gain; | 58 levels[c] = gain; |
60 if (pan != 0.0 && m_channels == 2) { | 60 if (pan != 0.0 && m_channels == 2) { |
61 levels[0] *= 1.0 - pan; | 61 levels[0] *= 1.0 - pan; |
62 levels[1] *= pan + 1.0; | 62 levels[1] *= pan + 1.0; |
63 } | 63 } |
64 | 64 |
65 double phasor = (f0 * 2 * M_PI) / m_sampleRate; | 65 // cerr << "ContinuousSynth::mix: f0 = " << f0 << " (from " << m_prevF0 << "), phase = " << m_phase << endl; |
66 double p = m_phase; | |
67 | |
68 cerr << "ContinuousSynth::mix: f0 = " << f0 << " (from " << m_prevF0 << "), phase = " << m_phase << ", phasor = " << phasor << endl; | |
69 | 66 |
70 for (int i = 0; i < m_blockSize; ++i) { | 67 for (int i = 0; i < m_blockSize; ++i) { |
71 | 68 |
72 p = m_phase + i * phasor; | 69 double fHere = (nowOn ? f0 : m_prevF0); |
70 | |
71 if (wasOn && nowOn && (f0 != m_prevF0) && (i < fadeLength)) { | |
72 // interpolate the frequency shift | |
73 fHere = m_prevF0 + ((f0 - m_prevF0) * i) / fadeLength; | |
74 } | |
75 | |
76 double phasor = (fHere * 2 * M_PI) / m_sampleRate; | |
77 | |
78 // cerr << "phasor = " << phasor << endl; | |
79 | |
80 m_phase = m_phase + phasor; | |
73 | 81 |
74 double v = sin(p); | 82 double v = sin(m_phase); |
75 | 83 |
76 if (!wasOn && i < fadeLength) { // fade in | 84 if (!wasOn && i < fadeLength) { |
85 // fade in | |
77 v = v * (i / double(fadeLength)); | 86 v = v * (i / double(fadeLength)); |
78 } else if (!nowOn) { | 87 } else if (!nowOn) { |
88 // fade out | |
79 if (i > fadeLength) v = 0; | 89 if (i > fadeLength) v = 0; |
80 else v = v * (1.0 - (i / double(fadeLength))); | 90 else v = v * (1.0 - (i / double(fadeLength))); |
81 } | 91 } |
82 | 92 |
83 for (int c = 0; c < m_channels; ++c) { | 93 for (int c = 0; c < m_channels; ++c) { |
84 toBuffers[c][i] += levels[c] * v; | 94 toBuffers[c][i] += levels[c] * v; |
85 } | 95 } |
86 } | 96 } |
87 | 97 |
88 m_prevF0 = f0; | 98 m_prevF0 = f0; |
89 m_phase = p; | |
90 | 99 |
91 delete[] levels; | 100 delete[] levels; |
92 } | 101 } |
93 | 102 |