Skip to content

Commit

Permalink
Merge branch 'dev41' into unicode
Browse files Browse the repository at this point in the history
  • Loading branch information
starg2 committed Oct 9, 2020
2 parents d0208b8 + dd7cf0a commit 83f7f17
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 21 deletions.
42 changes: 23 additions & 19 deletions timidity/dls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,50 +134,54 @@ struct DLSConnectionBlock
{
enum class SourceKind : std::uint16_t
{
None,
LFO,
KeyOnVelocity,
KeyNumber,
EG1,
EG2,
PitchWheel,
None = 0,
LFO = 1,
KeyOnVelocity = 2,
KeyNumber = 3,
EG1 = 4,
EG2 = 5,
PitchWheel = 6,

CC1 = 0x81,
CC7 = 0x87,
CC10 = 0x8A,
CC11 = 0x8B
CC11 = 0x8B,

RPN0 = 0x100,
RPN1 = 0x101,
RPN2 = 0x102
};

SourceKind Source;
SourceKind Control;

enum class DestinationKind : std::uint16_t
{
None,
Attenuation,
None = 0,
Attenuation = 1,
Pitch = 3,
Pan,
Pan = 4,

LFOFrequency = 0x104,
LFOStartDelay,
LFOStartDelay = 0x105,

EG1AttackTime = 0x206,
EG1DecayTime,
EG1DecayTime = 0x297,
EG1ReleaseTime = 0x209,
EG1SustainLevel,
EG1SustainLevel = 0x20A,

EG2AttackTime = 0x30A,
EG2DecayTime,
EG2DecayTime = 0x30B,
EG2ReleaseTime = 0x30D,
EG2SustainLevel
EG2SustainLevel = 0x30E
};

DestinationKind Destination;

enum class TransformKind : std::uint16_t
{
None,
Concave
None = 0,
Concave = 1
};

TransformKind Transform;
Expand Down Expand Up @@ -613,7 +617,7 @@ class DLSParser
case DLSConnectionBlock::DestinationKind::Pan:
if (b.Source == DLSConnectionBlock::SourceKind::None && b.Control == DLSConnectionBlock::SourceKind::None && b.Transform == DLSConnectionBlock::TransformKind::None)
{
pSample->sample_pan = std::clamp(b.Scale / 65536.0 / 1000.0, -0.5, 0.5);
pSample->sample_pan = std::clamp(b.Scale / 1000.0, -0.5, 0.5);
continue;
}
break;
Expand Down
2 changes: 1 addition & 1 deletion timidity/instrum.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ typedef struct _Sample {
int8 xfmode_key, xfin_lokey, xfin_hikey, xfout_lokey, xfout_hikey;
int8 xfmode_vel, xfin_lovel, xfin_hivel, xfout_lovel, xfout_hivel;

// keyswitches (requires MODES_KEYSWITCHES)
// keyswitches (requires MODES_KEYSWITCH)
int8 sw_lokey, sw_hikey, sw_default, sw_down, sw_up, sw_previous, sw_lolast, sw_hilast;
} Sample;

Expand Down
65 changes: 64 additions & 1 deletion timidity/sfz.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,7 @@ enum class OpCodeKind
AmpKeyCenter,
AmpKeyTrack,
AmpVelTrack,
Cutoff,
DefaultPath,
End,
HiKey,
Expand All @@ -841,6 +842,8 @@ enum class OpCodeKind
Key,
Pan,
PitchKeyCenter,
Position,
Resonance,
RtDecay,
Sample,
SequenceLength,
Expand All @@ -858,6 +861,7 @@ enum class OpCodeKind
Trigger,
Tune,
Volume,
Width,
XfInHiKey,
XfInHiVel,
XfInLoKey,
Expand Down Expand Up @@ -1041,6 +1045,7 @@ class Parser : private BasicParser
case OpCodeKind::AmpEG_Sustain:
case OpCodeKind::AmpKeyTrack:
case OpCodeKind::AmpVelTrack:
case OpCodeKind::Cutoff:
case OpCodeKind::End:
case OpCodeKind::HiRand:
case OpCodeKind::HiVelocity:
Expand All @@ -1050,12 +1055,15 @@ class Parser : private BasicParser
case OpCodeKind::LoVelocity:
case OpCodeKind::Offset:
case OpCodeKind::Pan:
case OpCodeKind::Position:
case OpCodeKind::Resonance:
case OpCodeKind::RtDecay:
case OpCodeKind::SequenceLength:
case OpCodeKind::SequencePosition:
case OpCodeKind::Transpose:
case OpCodeKind::Tune:
case OpCodeKind::Volume:
case OpCodeKind::Width:
case OpCodeKind::XfInHiVel:
case OpCodeKind::XfInLoVel:
case OpCodeKind::XfOutHiVel:
Expand Down Expand Up @@ -1197,6 +1205,7 @@ class Parser : private BasicParser
{"amp_keycenter"sv, OpCodeKind::AmpKeyCenter},
{"amp_keytrack"sv, OpCodeKind::AmpKeyTrack},
{"amp_veltrack"sv, OpCodeKind::AmpVelTrack},
{"cutoff"sv, OpCodeKind::Cutoff},
{"default_path"sv, OpCodeKind::DefaultPath},
{"end"sv, OpCodeKind::End},
{"hikey"sv, OpCodeKind::HiKey},
Expand All @@ -1212,6 +1221,8 @@ class Parser : private BasicParser
{"offset"sv, OpCodeKind::Offset},
{"pan"sv, OpCodeKind::Pan},
{"pitch_keycenter"sv, OpCodeKind::PitchKeyCenter},
{"position"sv, OpCodeKind::Position},
{"resonance"sv, OpCodeKind::Resonance},
{"rt_decay"sv, OpCodeKind::RtDecay},
{"sample"sv, OpCodeKind::Sample},
{"seq_length"sv, OpCodeKind::SequenceLength},
Expand All @@ -1229,6 +1240,7 @@ class Parser : private BasicParser
{"trigger"sv, OpCodeKind::Trigger},
{"tune"sv, OpCodeKind::Tune},
{"volume"sv, OpCodeKind::Volume},
{"width"sv, OpCodeKind::Width},
{"xf_keycurve"sv, OpCodeKind::XfKeyCurve},
{"xf_velcurve"sv, OpCodeKind::XfVelCurve},
{"xfin_hikey"sv, OpCodeKind::XfInHiKey},
Expand Down Expand Up @@ -1631,7 +1643,47 @@ class InstrumentBuilder
+ std::clamp(flatSection.GetAs<double>(OpCodeKind::Tune).value_or(0.0), -100.0, 100.0) / 1200.0
);

s.sample_pan = std::clamp(flatSection.GetAs<double>(OpCodeKind::Pan).value_or(0.0), -100.0, 100.0) / 200.0;

double panValue = std::clamp(flatSection.GetAs<double>(OpCodeKind::Pan).value_or(0.0) / 200.0, -0.5, 0.5);

if (pSampleInstrument->samples == 2) // stereo
{
s.volume *= std::clamp((i == 0 ? 0.5 - panValue : panValue + 0.5) * 2.0, 0.0, 2.0);

s.sample_pan = std::clamp(
s.sample_pan * flatSection.GetAs<double>(OpCodeKind::Width).value_or(100.0) / 100.0,
-0.5,
0.5
);

s.sample_pan = std::clamp(
s.sample_pan + flatSection.GetAs<double>(OpCodeKind::Position).value_or(0.0) / 100.0,
-0.5,
0.5
);
}
else
{
s.sample_pan = panValue;

if (i == 0)
{
for (auto op : {OpCodeKind::Width, OpCodeKind::Position})
{
if (flatSection.GetAs<double>(op).has_value())
{
auto loc = flatSection.GetLocationForOpCode(op);
ctl->cmsg(
CMSG_WARNING,
VERB_VERBOSE,
"%s(%u): 'width' and 'position' opcodes are only operational for stereo samples",
std::string(m_Parser.GetPreprocessor().GetFileNameFromID(loc.FileID)).c_str(),
static_cast<std::uint32_t>(loc.Line)
);
}
}
}
}

s.envelope_keyf_bpo = static_cast<int8>(std::clamp(flatSection.GetAs<std::int32_t>(OpCodeKind::AmpKeyCenter).value_or(60), -127, 127));
s.envelope_velf_bpo = 0;
Expand Down Expand Up @@ -1721,6 +1773,17 @@ class InstrumentBuilder
);
}

if (auto cutoff = flatSection.GetAs<double>(OpCodeKind::Cutoff))
{
s.cutoff_freq = std::clamp(static_cast<int32>(std::round(cutoff.value())), 1, 20000);
}

if (auto resonance = flatSection.GetAs<double>(OpCodeKind::Resonance))
{
int resoCB = static_cast<int>(std::round(std::clamp(resonance.value(), 0.0, 40.0) * 10.0));
s.resonance = static_cast<int16>(std::clamp(resoCB, 0, 960));
}

if (auto seqLen = flatSection.GetAs<double>(OpCodeKind::SequenceLength))
{
s.seq_length = std::clamp(static_cast<int32>(std::round(seqLen.value())), 1, 100);
Expand Down

0 comments on commit 83f7f17

Please sign in to comment.