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