From 9b478615e7f0cd73c360fd289b05db52b5f730f1 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Wed, 16 May 2018 01:31:18 +0200 Subject: storing adldata and adlinsdata in unified structures --- src/adlmidi_private.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/adlmidi_private.cpp') diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp index 1f3cb7d..1e62250 100644 --- a/src/adlmidi_private.cpp +++ b/src/adlmidi_private.cpp @@ -38,8 +38,8 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) { size_t div = (a >= play->opl.dynamic_percussion_offset) ? 1 : 0; ++n_total[div]; - adlinsdata &ins = play->opl.dynamic_metainstruments[a]; - if((ins.adlno1 != ins.adlno2) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + adlinsdata2 &ins = play->opl.dynamic_metainstruments[a]; + if((ins.adl[0] != ins.adl[1]) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) ++n_fourop[div]; } @@ -57,8 +57,8 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) if(insno == 198) continue; ++n_total[a / 128]; - const adlinsdata &ins = adlins[insno]; - if((ins.adlno1 != ins.adlno2) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + adlinsdata2 ins(adlins[insno]); + if((ins.adl[0] != ins.adl[1]) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) ++n_fourop[a / 128]; } -- cgit v1.2.3 From bb4797ee68c0f12018196d3ee8caddcdcad9fe38 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Sat, 19 May 2018 22:33:37 +0300 Subject: Works and fixes - Fixed an incorrect calculation of 4-op channels and choosing 4-op channels for 2-op only banks - Resolved trouble with automatically chosen flags because of internal confusion --- src/adlmidi_private.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'src/adlmidi_private.cpp') diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp index 1e62250..920f5dc 100644 --- a/src/adlmidi_private.cpp +++ b/src/adlmidi_private.cpp @@ -39,13 +39,13 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) size_t div = (a >= play->opl.dynamic_percussion_offset) ? 1 : 0; ++n_total[div]; adlinsdata2 &ins = play->opl.dynamic_metainstruments[a]; - if((ins.adl[0] != ins.adl[1]) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + if(ins.flags & adlinsdata::Flag_Real4op) ++n_fourop[div]; } - play->m_setup.NumFourOps = - (n_fourop[0] >= 128 * 7 / 8) ? play->m_setup.NumCards * 6 - : (n_fourop[0] < 128 * 1 / 8) ? (n_fourop[1] > 0 ? 4 : 0) + play->m_setup.NumFourOps = ((n_fourop[0] == 0) && (n_fourop[1] == 0)) ? 0 + : (n_fourop[0] >= (128 * 7) / 8) ? play->m_setup.NumCards * 6 + : (n_fourop[0] < (128 * 1) / 8) ? (n_fourop[1] > 0 ? 4 : 0) : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); } else @@ -58,13 +58,13 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) continue; ++n_total[a / 128]; adlinsdata2 ins(adlins[insno]); - if((ins.adl[0] != ins.adl[1]) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + if(ins.flags & adlinsdata::Flag_Real4op) ++n_fourop[a / 128]; } - play->m_setup.NumFourOps = - (n_fourop[0] >= (n_total[0] % 128) * 7 / 8) ? play->m_setup.NumCards * 6 - : (n_fourop[0] < (n_total[0] % 128) * 1 / 8) ? 0 + play->m_setup.NumFourOps = ((n_fourop[0] == 0) && (n_fourop[1] == 0)) ? 0 + : (n_fourop[0] >= ((n_total[0] % 128) * 7) / 8) ? play->m_setup.NumCards * 6 + : (n_fourop[0] < ((n_total[0] % 128) * 1) / 8) ? 0 : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); } @@ -80,4 +80,3 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) return 0; } - -- cgit v1.2.3 From 77cf2d49be3a88ea2b5972b70bb031b1475cb8c0 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Thu, 31 May 2018 05:30:27 +0200 Subject: attempt to rework 4op count computation --- src/adlmidi_private.cpp | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) (limited to 'src/adlmidi_private.cpp') diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp index 920f5dc..7a8b3b2 100644 --- a/src/adlmidi_private.cpp +++ b/src/adlmidi_private.cpp @@ -36,17 +36,15 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) //For custom bank for(size_t a = 0; a < play->opl.dynamic_metainstruments.size(); ++a) { + adlinsdata2 &ins = play->opl.dynamic_metainstruments[a]; + if(ins.flags & adlinsdata::Flag_NoSound) + continue; + size_t div = (a >= play->opl.dynamic_percussion_offset) ? 1 : 0; ++n_total[div]; - adlinsdata2 &ins = play->opl.dynamic_metainstruments[a]; if(ins.flags & adlinsdata::Flag_Real4op) ++n_fourop[div]; } - - play->m_setup.NumFourOps = ((n_fourop[0] == 0) && (n_fourop[1] == 0)) ? 0 - : (n_fourop[0] >= (128 * 7) / 8) ? play->m_setup.NumCards * 6 - : (n_fourop[0] < (128 * 1) / 8) ? (n_fourop[1] > 0 ? 4 : 0) - : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); } else { @@ -61,22 +59,14 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) if(ins.flags & adlinsdata::Flag_Real4op) ++n_fourop[a / 128]; } - - play->m_setup.NumFourOps = ((n_fourop[0] == 0) && (n_fourop[1] == 0)) ? 0 - : (n_fourop[0] >= ((n_total[0] % 128) * 7) / 8) ? play->m_setup.NumCards * 6 - : (n_fourop[0] < ((n_total[0] % 128) * 1) / 8) ? 0 - : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); } - play->opl.NumFourOps = play->m_setup.NumFourOps; + unsigned NumFourOps = ((n_fourop[0] == 0) && (n_fourop[1] == 0)) ? 0 + : (n_fourop[0] >= (n_total[0] * 7) / 8) ? play->m_setup.NumCards * 6 + : (n_fourop[0] < (n_total[0] * 1) / 8) ? 0 + : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); - if(n_fourop[0] >= n_total[0] * 15 / 16 && play->m_setup.NumFourOps == 0) - { - play->setErrorString("ERROR: You have selected a bank that consists almost exclusively of four-op patches.\n" - " The results (silence + much cpu load) would be probably\n" - " not what you want, therefore ignoring the request.\n"); - return -1; - } + play->opl.NumFourOps = play->m_setup.NumFourOps = NumFourOps; return 0; } -- cgit v1.2.3 From 274c9d6b64f8ba8461d398b24c0c6c99f94d03e4 Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Fri, 1 Jun 2018 01:10:41 +0300 Subject: Improve the automatic 4op channels count choosing formula --- src/adlmidi_private.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/adlmidi_private.cpp') diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp index 7a8b3b2..83a40aa 100644 --- a/src/adlmidi_private.cpp +++ b/src/adlmidi_private.cpp @@ -61,10 +61,25 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) } } + unsigned NumFourOps = 0; + // All 2ops (no 4ops) + if((n_fourop[0] == 0) && (n_fourop[1] == 0)) + NumFourOps = 0; + // All 2op melodics and Some (or All) 4op drums + else if((n_fourop[0] == 0) && (n_fourop[1] > 0)) + NumFourOps = (play->m_setup.NumCards == 1) ? 2 : play->m_setup.NumCards * 4; + // Many 4op melodics + else if((n_fourop[0] >= (n_total[0] * 7) / 8)) + NumFourOps = play->m_setup.NumCards * 6; + // Few 4op melodics + else if(n_fourop[0] > 0) + NumFourOps = play->m_setup.NumCards * 4; + +/* //Old formula unsigned NumFourOps = ((n_fourop[0] == 0) && (n_fourop[1] == 0)) ? 0 : (n_fourop[0] >= (n_total[0] * 7) / 8) ? play->m_setup.NumCards * 6 - : (n_fourop[0] < (n_total[0] * 1) / 8) ? 0 : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); +*/ play->opl.NumFourOps = play->m_setup.NumFourOps = NumFourOps; -- cgit v1.2.3 From 4b0ffdce25540765276ef2e6f6f8cc72a733f7cf Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Fri, 1 Jun 2018 01:18:21 +0300 Subject: Small polish of the 4op channels count auto-choose formula --- src/adlmidi_private.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src/adlmidi_private.cpp') diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp index 83a40aa..3d9d9e9 100644 --- a/src/adlmidi_private.cpp +++ b/src/adlmidi_private.cpp @@ -61,19 +61,20 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) } } - unsigned NumFourOps = 0; + unsigned numFourOps = 0; + // All 2ops (no 4ops) if((n_fourop[0] == 0) && (n_fourop[1] == 0)) - NumFourOps = 0; + numFourOps = 0; // All 2op melodics and Some (or All) 4op drums else if((n_fourop[0] == 0) && (n_fourop[1] > 0)) - NumFourOps = (play->m_setup.NumCards == 1) ? 2 : play->m_setup.NumCards * 4; + numFourOps = 2; // Many 4op melodics else if((n_fourop[0] >= (n_total[0] * 7) / 8)) - NumFourOps = play->m_setup.NumCards * 6; + numFourOps = 6; // Few 4op melodics else if(n_fourop[0] > 0) - NumFourOps = play->m_setup.NumCards * 4; + numFourOps = 4; /* //Old formula unsigned NumFourOps = ((n_fourop[0] == 0) && (n_fourop[1] == 0)) ? 0 @@ -81,7 +82,7 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) : (play->m_setup.NumCards == 1 ? 1 : play->m_setup.NumCards * 4); */ - play->opl.NumFourOps = play->m_setup.NumFourOps = NumFourOps; + play->opl.NumFourOps = play->m_setup.NumFourOps = (numFourOps * play->m_setup.NumCards); return 0; } -- cgit v1.2.3 From c4ed5cf15e64a84129865a58b5063ef0e73f0bcf Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Wed, 16 May 2018 14:27:04 +0200 Subject: bank storage inside dynamic map --- src/adlmidi_private.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'src/adlmidi_private.cpp') diff --git a/src/adlmidi_private.cpp b/src/adlmidi_private.cpp index 3d9d9e9..77319d7 100644 --- a/src/adlmidi_private.cpp +++ b/src/adlmidi_private.cpp @@ -34,16 +34,21 @@ int adlRefreshNumCards(ADL_MIDIPlayer *device) if(play->opl.AdlBank == ~0u) { //For custom bank - for(size_t a = 0; a < play->opl.dynamic_metainstruments.size(); ++a) + OPL3::BankMap::iterator it = play->opl.dynamic_banks.begin(); + OPL3::BankMap::iterator end = play->opl.dynamic_banks.end(); + for(; it != end; ++it) { - adlinsdata2 &ins = play->opl.dynamic_metainstruments[a]; - if(ins.flags & adlinsdata::Flag_NoSound) - continue; - - size_t div = (a >= play->opl.dynamic_percussion_offset) ? 1 : 0; - ++n_total[div]; - if(ins.flags & adlinsdata::Flag_Real4op) - ++n_fourop[div]; + uint16_t bank = it->first; + unsigned div = (bank & OPL3::PercussionTag) ? 1 : 0; + for(unsigned i = 0; i < 128; ++i) + { + adlinsdata2 &ins = it->second.ins[i]; + if(ins.flags & adlinsdata::Flag_NoSound) + continue; + if((ins.adl[0] != ins.adl[1]) && ((ins.flags & adlinsdata::Flag_Pseudo4op) == 0)) + ++n_fourop[div]; + ++n_total[div]; + } } } else -- cgit v1.2.3