MuseScore/zerberus/zone.h
anatoly-os e8d4092ea1 fix #274258, fix #274396: implement global_volume and attenuate Zerberus
Attenuated Zerberus to be 4.5dB louder.
2018-07-18 13:59:01 +02:00

126 lines
3.5 KiB
C++

//=============================================================================
// MuseSynth
// Music Software Synthesizer
//
// Copyright (C) 2013 Werner Schweer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
#ifndef __ZONE_H__
#define __ZONE_H__
class Sample;
class Channel;
//---------------------------------------------------------
// Trigger
//---------------------------------------------------------
enum class Trigger : char {
ATTACK, RELEASE, FIRST, LEGATO, CC
};
//---------------------------------------------------------
// LoopMode
//---------------------------------------------------------
enum class LoopMode : char {
NO_LOOP, ONE_SHOT, CONTINUOUS, SUSTAIN
};
//---------------------------------------------------------
// OffMode
//---------------------------------------------------------
enum class OffMode : char {
FAST, NORMAL
};
enum class FilterType {
lpf_2p, //default, double-pole low-pass filter
lpf_1p, //single-pole low-pass filter
hpf_2p, //double-pole high-pass filter
hpf_1p, //single-pole high-pass filter
bpf_2p, //double-pole band-pass filter
brf_2p //double-pole band-reject filter
};
//---------------------------------------------------------
// Zone
//---------------------------------------------------------
struct Zone {
Sample* sample = 0;
long long offset = 0; //[0, 4294967295]
int seq = 0;
int seqLen = 0;
int seqPos = 0;
char keyLo = 0;
char keyHi = 127;
char veloLo = 0;
char veloHi = 127;
char keyBase = 60;
int tune = 0; // fine tuning in cent (-100 - +100)
double pitchKeytrack = 100.0;
float volume = 1.0;
float lVol = .5;
float rVol = .5;
float ampVeltrack = 100; // amplifier velocity tracking
float ampegDelay = 0.0;
float ampegStart = 0.0;
float ampegAttack = 1.0;
float ampegHold = 0.0;
float ampegDecay = 0.0;
float ampegSustain = 1.0;
float ampegRelease = 200.0; // release time in ms
float ampegVel2Delay = 0.0;
float ampegVel2Attack = 0.0;
float ampegVel2Hold = 0.0;
float ampegVel2Decay = 0.0;
float ampegVel2Sustain = 0.0;
float ampegVel2Release = 0.0;
float rtDecay = 0.0;
float delay = 0.0;
int pan = 0;
float group_volume = 1.0;
float global_volume = 1.0;
//filters
bool isCutoffDefined;
float cutoff; //[0, sampleRate / 2] Hz
int fil_keytrack; //[0, 1200] cents
int fil_keycenter; //[0, 127]
int fil_veltrack; //[-9600, 9600] cents
FilterType fil_type = FilterType::lpf_2p;
Trigger trigger = Trigger::ATTACK;
LoopMode loopMode = LoopMode::NO_LOOP;
OffMode offMode = OffMode::FAST;
int group = 0;
int offBy = 0;
long long loopStart, loopEnd;
double loRand = 0.0;
double hiRand = 1.0;
std::map<int, double> gainOnCC;
double ccGain = 1.0;
int onLocc[128];
int onHicc[128];
int locc[128];
int hicc[128];
bool useCC = false;
Zone();
~Zone();
bool match(Channel*, int key, int velo, Trigger, double rand, int cc, int ccVal);
void updateCCGain(Channel* c);
};
#endif