mirror of
https://github.com/yokemura/Magical8bitPlug2.git
synced 2025-07-17 11:04:16 -04:00
Added code
This commit is contained in:
88
Source/NoiseVoice.cpp
Normal file
88
Source/NoiseVoice.cpp
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
NoiseVoice.cpp
|
||||
Created: 11 Nov 2019 9:37:21pm
|
||||
Author: 除村 武志
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#include "NoiseVoice.h"
|
||||
|
||||
//---------------------------------------------
|
||||
//
|
||||
// Noise Voice
|
||||
//
|
||||
//---------------------------------------------
|
||||
NoiseVoice::NoiseVoice(SettingRefs *sRefs) : TonalVoice(sRefs) {}
|
||||
|
||||
void NoiseVoice::startNote(int midiNoteNumber, float velocity, SynthesiserSound *, int currentPitchBendPosition) {
|
||||
TonalVoice::startNote(midiNoteNumber, velocity, 0, currentPitchBendPosition);
|
||||
switch (settingRefs->noiseAlgorithm()) {
|
||||
case kNoiseInfinite2:
|
||||
cycleLength = MathConstants<float>::pi / 25.0;
|
||||
break;
|
||||
|
||||
case kNoiseLong:
|
||||
case kNoiseShort:
|
||||
cycleLength = MathConstants<float>::pi / 8.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
cycleLength = MathConstants<float>::pi / 8.0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
float NoiseVoice::voltageForAngle (double angle)
|
||||
{
|
||||
// TODO: StartVoice側でangleDeltaを調整する方が良い
|
||||
// double dividedAngle = fmod(angle, MathConstants<float>::pi / 2.0);
|
||||
bool isNewCycle = angle < previousAngle;
|
||||
bool shouldUpdate = false;
|
||||
|
||||
if (isNewCycle)
|
||||
{
|
||||
shouldUpdate = true;
|
||||
}
|
||||
else if (nextAngle != 0)
|
||||
{
|
||||
if (angle >= nextAngle)
|
||||
{
|
||||
shouldUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldUpdate)
|
||||
{
|
||||
if (settingRefs->noiseAlgorithm() == kNoiseInfinite2)
|
||||
{
|
||||
currentVoltage = float (rand() % 16 - 8) / 16.;
|
||||
}
|
||||
else
|
||||
{
|
||||
int compareBitPos = settingRefs->noiseAlgorithm() == kNoiseLong ? 1 : 6;
|
||||
|
||||
unsigned int bit0 = rgstr & 0b0000001;
|
||||
unsigned int compared = (rgstr & 1 << compareBitPos) >> compareBitPos;
|
||||
unsigned int feedback = bit0 ^ compared;
|
||||
|
||||
rgstr = rgstr >> 1;
|
||||
|
||||
unsigned int mask = ~ (1 << 14);
|
||||
unsigned int writeback = feedback << 14;
|
||||
rgstr = (rgstr & mask) | writeback;
|
||||
|
||||
currentVoltage = (float)bit0 - 0.5;
|
||||
}
|
||||
|
||||
nextAngle = (double) ((int) (angle / cycleLength) + 1) * cycleLength;
|
||||
|
||||
if (nextAngle >= MathConstants<float>::pi * 2) { nextAngle = 0; }
|
||||
}
|
||||
|
||||
previousAngle = angle;
|
||||
|
||||
return currentVoltage;
|
||||
}
|
Reference in New Issue
Block a user