Added fixes from main repository to version 0.9.3

pull/1/head
Holger Wirtz 8 years ago
parent b3d5223a74
commit b7d73f6a92
  1. 7
      src/msfa/controllers.h
  2. 4
      src/msfa/dx7note.cc
  3. 121
      src/msfa/lfo.cc

@ -18,6 +18,7 @@
#define __CONTROLLERS_H #define __CONTROLLERS_H
#include "synth.h" #include "synth.h"
#include "../Dexed.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "trace.h" #include "trace.h"
@ -113,14 +114,14 @@ public:
applyMod(foot_cc, foot); applyMod(foot_cc, foot);
applyMod(aftertouch_cc, at); applyMod(aftertouch_cc, at);
if ( ! ((wheel.eg || foot.eg) || (breath.eg || at.eg)) ) /* if ( ! ((wheel.eg || foot.eg) || (breath.eg || at.eg)) )
eg_mod = 127; eg_mod = 127;
*/
TRACE("amp_mod %d pitch_mod %d", amp_mod, pitch_mod); TRACE("amp_mod %d pitch_mod %d", amp_mod, pitch_mod);
} }
FmCore *core=NULL; FmCore *core;
}; };
#endif // __CONTROLLERS_H #endif // __CONTROLLERS_H

@ -211,8 +211,8 @@ void Dx7Note::compute(int32_t *buf, int32_t lfo_val, int32_t lfo_delay, const Co
uint32_t amd_mod = max(amod_1, amod_2); uint32_t amd_mod = max(amod_1, amod_2);
// ==== EG AMP MOD ==== // ==== EG AMP MOD ====
uint32_t amod_3 = (ctrls->eg_mod+1) << 16; uint32_t amod_3 = (ctrls->eg_mod+1) << 17;
amd_mod = max((1<<23) - amod_3, amd_mod); amd_mod = max((1<<24) - amod_3, amd_mod);
// ==== OP RENDER ==== // ==== OP RENDER ====
for (int op = 0; op < 6; op++) { for (int op = 0; op < 6; op++) {

@ -1,12 +1,12 @@
/* /*
* Copyright 2013 Google Inc. * Copyright 2013 Google Inc.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
* *
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -24,74 +24,75 @@
uint32_t Lfo::unit_; uint32_t Lfo::unit_;
void Lfo::init(double sample_rate) { void Lfo::init(double sample_rate) {
// constant is 1 << 32 / 15.5s / 11 // constant is 1 << 32 / 15.5s / 11
Lfo::unit_ = (int32_t)(N * 25190424 / sample_rate + 0.5); Lfo::unit_ = (int32_t)(N * 25190424 / sample_rate + 0.5);
} }
void Lfo::reset(const uint8_t params[6]) { void Lfo::reset(const uint8_t params[6]) {
int rate = params[0]; // 0..99 int rate = params[0]; // 0..99
int sr = rate == 0 ? 1 : (165 * rate) >> 6; int sr = rate == 0 ? 1 : (165 * rate) >> 6;
sr *= sr < 160 ? 11 : (11 + ((sr - 160) >> 4)); sr *= sr < 160 ? 11 : (11 + ((sr - 160) >> 4));
delta_ = unit_ * sr; delta_ = unit_ * sr;
int a = 99 - params[1]; // LFO delay int a = 99 - params[1]; // LFO delay
if (a == 99) { if (a == 99) {
delayinc_ = ~0u; delayinc_ = ~0u;
delayinc2_ = ~0u; delayinc2_ = ~0u;
} else { } else {
a = (16 + (a & 15)) << (1 + (a >> 4)); a = (16 + (a & 15)) << (1 + (a >> 4));
delayinc_ = unit_ * a; delayinc_ = unit_ * a;
a &= 0xff80; a &= 0xff80;
a = max(0x80, a); a = max(0x80, a);
delayinc2_ = unit_ * a; delayinc2_ = unit_ * a;
} }
waveform_ = params[5]; waveform_ = params[5];
sync_ = params[4] != 0; sync_ = params[4] != 0;
} }
int32_t Lfo::getsample() { int32_t Lfo::getsample() {
phase_ += delta_; phase_ += delta_;
int32_t x; int32_t x;
switch (waveform_) { switch (waveform_) {
case 0: // triangle case 0: // triangle
x = phase_ >> 7; x = phase_ >> 7;
x ^= -(phase_ >> 31); x ^= -(phase_ >> 31);
x &= (1 << 24) - 1; x &= (1 << 24) - 1;
return x; return x;
case 1: // sawtooth down case 1: // sawtooth down
return (~phase_ ^ (1U << 31)) >> 8; return (~phase_ ^ (1U << 31)) >> 8;
case 2: // sawtooth up case 2: // sawtooth up
return (phase_ ^ (1U << 31)) >> 8; return (phase_ ^ (1U << 31)) >> 8;
case 3: // square case 3: // square
return ((~phase_) >> 7) & (1 << 24); return ((~phase_) >> 7) & (1 << 24);
case 4: // sine case 4: // sine
return (1 << 23) + (Sin::lookup(phase_ >> 8) >> 1); return (1 << 23) + (Sin::lookup(phase_ >> 8) >> 1);
case 5: // s&h case 5: // s&h
if (phase_ < delta_) { if (phase_ < delta_) {
randstate_ = (randstate_ * 179 + 17) & 0xff; randstate_ = (randstate_ * 179 + 17) & 0xff;
}
x = randstate_ ^ 0x80;
return (x + 1) << 16;
} }
x = randstate_ ^ 0x80; return 1 << 23;
return (x + 1) << 16;
}
return 1 << 23;
} }
int32_t Lfo::getdelay() { int32_t Lfo::getdelay() {
uint32_t delta = delaystate_ < (1U << 31) ? delayinc_ : delayinc2_; uint32_t delta = delaystate_ < (1U << 31) ? delayinc_ : delayinc2_;
uint32_t d = delaystate_ + delta; uint64_t d = ((uint64_t)delaystate_) + delta;
if (d < delayinc_) { if (d > ~0u) {
return 1 << 24; return 1 << 24;
} }
delaystate_ = d; delaystate_ = d;
if (d < (1U << 31)) { if (d < (1U << 31)) {
return 0; return 0;
} else { } else {
return (d >> 7) & ((1 << 24) - 1); return (d >> 7) & ((1 << 24) - 1);
} }
} }
void Lfo::keydown() { void Lfo::keydown() {
if (sync_) { if (sync_) {
phase_ = (1U << 31) - 1; phase_ = (1U << 31) - 1;
} }
delaystate_ = 0; delaystate_ = 0;
} }

Loading…
Cancel
Save