39 , pSoundGenerator(nullptr)
41 , mLeft((uint)mMaxNumberOfFrames)
42 , mRight((uint)mMaxNumberOfFrames)
59 if (not soundgenerator)
61 qDebug() <<
"Sound generator pointer invalid";
64 pTones = soundgenerator->getTones();
86 constexpr
double volumeFactor = 32;
93 if (frames==0)
return 0;
96 qint32* leftarray =
mLeft.data();
97 qint32* rightarray =
mRight.data();
100 memset(leftarray, 0,
sizeof(qint32)*frames);
101 memset(rightarray, 0,
sizeof(qint32)*frames);
108 for (
Tone &tone : *
pTones)
if (tone.mState != Tone::State::TERMINATED)
110 qint32 volume =
static_cast<qint32
>(volumeFactor*tone.mVolume);
112 Wave &sample = tone.getSample();
113 const QVector<qint16>* pcm;
114 if (tone.mType == Tone::Type::RELEASETONE)
124 const qint16* waveformpointer = pcm->data();
125 quint32 arrayindexmax = pcm->size();
126 if (arrayindexmax==0)
continue;
127 quint32 time = tone.mTime;
128 int key = tone.mKey & 0x7F;
130 quint32 repetitionTime = (tone.pSample->getRepetitionIndex()) << 11;
131 double repetitionFactor = tone.pSample->getRepetitionFactor();
133 qint16 left = tone.left;
134 qint16 right = tone.right;
135 for (
size_t j=0; j<frames; j++)
137 qint32 weight = (time & 0xFFFU) ^ 0xFFFU;
138 qint32 norm = weight | 0x1000U;
139 quint32 arrayindex = (time>>11) & 0x1FFFFEU;
140 left = ((waveformpointer[arrayindex]<<12) + weight*left)/norm;
141 right = ((waveformpointer[arrayindex+1]<<12) + weight*right)/norm;
142 leftarray[j] += volume*left;
143 rightarray[j] += volume*right;
146 if (arrayindex >= arrayindexmax-2)
149 if (repetitionTime and tone.mType != Tone::Type::RELEASETONE)
151 time = (time & 0xFFFU) | repetitionTime;
152 tone.mVolume *= repetitionFactor;
153 volume =
static_cast<qint32
>(volumeFactor*tone.mVolume);
162 tone.mState = Tone::State::TERMINATED;
168 if (tone.mState == Tone::State::RELEASED)
170 tone.mVolume *= 0.99;
171 volume = 99 * volume / 100;
185 size_t buffersize = 2*frames*bytes;
188 memset(buffer, 0, buffersize);
191 qint16* audioptr = (qint16*)buffer;
194 for (
size_t j=0; j<frames; j++)
196 qint32 signalleft = leftarray[j]>>7;
197 qint32 signalright = rightarray[j]>>7;
200 audioptr[i++] += (qint16)(signalleft>>8);
201 audioptr[i++] += (qint16)(signalright>>8);
205 audioptr[i++] += (qint16)(signalleft & 0xFFFFU);
206 audioptr[i++] += (qint16)((signalleft>>16) | ((signalright & 0xFFU)<<16));
207 audioptr[i++] += (qint16)(signalright >> 8);
Class managing the generation of sound.
Class holding the sampled sound for one key.
int sampleSize
Sample size (16 or 24)
AudioParameters mParameters
Local copy of the audio parameters.
const QVector< qint16 > * getSustainSample()
SoundGenerator * pSoundGenerator
Pointer to the SoundGenerator.
QVector< qint32 > mRight
Audio signal to be constructed.
Virtual base class for audio-generating modules.
Class describing a tone that is currently being played.
Sampler()
Constructor of the Sampler without functionality.
size_t generateSound(char *charbuffer, size_t maxSize) override final
Essential sound-generating function of the sampler.
void init(SoundGenerator *soundgenerator)
Initialization of the sampler.
const QVector< qint16 > * getReleaseSample()
size_t mMaxNumberOfFrames
Maximal number of frames per buffer.
QList< Tone > * pTones
Pointer to the list of tones held by SoundGenerator.
quint32 getIncrement(int key)