aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi.cpp
diff options
context:
space:
mode:
authorVitaly Novichkov <admin@wohlnet.ru>2018-08-06 01:56:50 +0300
committerVitaly Novichkov <admin@wohlnet.ru>2018-08-06 01:56:50 +0300
commit1ab34e88a326c396fbb42c503eb4ffa56fa0a148 (patch)
tree4f2d6ada0ab0bd1d64947a71c5492a29be7c8dbf /src/adlmidi.cpp
parent0a003c8bc12514a5586f2f0e40559fcbf6607883 (diff)
parent0e2807a9d4c8c900e85c9b33ba96c69a82c58a68 (diff)
downloadlibADLMIDI-1ab34e88a326c396fbb42c503eb4ffa56fa0a148.tar.gz
libADLMIDI-1ab34e88a326c396fbb42c503eb4ffa56fa0a148.tar.bz2
libADLMIDI-1ab34e88a326c396fbb42c503eb4ffa56fa0a148.zip
Merge branch 'master' into stable
Diffstat (limited to 'src/adlmidi.cpp')
-rw-r--r--src/adlmidi.cpp182
1 files changed, 151 insertions, 31 deletions
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp
index 32872ef..c7c5cf3 100644
--- a/src/adlmidi.cpp
+++ b/src/adlmidi.cpp
@@ -72,6 +72,18 @@ ADLMIDI_EXPORT struct ADL_MIDIPlayer *adl_init(long sample_rate)
return midi_device;
}
+ADLMIDI_EXPORT void adl_close(struct ADL_MIDIPlayer *device)
+{
+ if(!device)
+ return;
+ MIDIplay * play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
+ if(play)
+ delete play;
+ device->adl_midiPlayer = NULL;
+ free(device);
+ device = NULL;
+}
+
ADLMIDI_EXPORT int adl_setDeviceIdentifier(ADL_MIDIPlayer *device, unsigned id)
{
if(!device || id > 0x0f)
@@ -102,7 +114,7 @@ ADLMIDI_EXPORT int adl_setNumChips(ADL_MIDIPlayer *device, int numChips)
}
play->m_synth.m_numChips = play->m_setup.numChips;
- adl_reset(device);
+ play->partialReset();
return adlRefreshNumCards(device);
}
@@ -123,8 +135,8 @@ ADLMIDI_EXPORT int adl_setBank(ADL_MIDIPlayer *device, int bank)
ADL_UNUSED(bank);
MidiPlayer *play = GET_MIDI_PLAYER(device);
play->setErrorString("This build of libADLMIDI has no embedded banks. "
- "Please load bank by using of adl_openBankFile() or "
- "adl_openBankData() functions instead of adl_setBank()");
+ "Please load banks by using adl_openBankFile() or "
+ "adl_openBankData() functions instead of adl_setBank().");
return -1;
#else
const uint32_t NumBanks = static_cast<uint32_t>(maxAdlBanks());
@@ -304,6 +316,37 @@ ADLMIDI_EXPORT int adl_setInstrument(ADL_MIDIPlayer *device, ADL_Bank *bank, uns
return 0;
}
+ADLMIDI_EXPORT int adl_loadEmbeddedBank(struct ADL_MIDIPlayer *device, ADL_Bank *bank, int num)
+{
+ if(!device)
+ return -1;
+ MidiPlayer *play = GET_MIDI_PLAYER(device);
+ if (!play)
+ return -1;
+
+#ifdef DISABLE_EMBEDDED_BANKS
+ ADL_UNUSED(bank);
+ ADL_UNUSED(num);
+ play->setErrorString("This build of libADLMIDI has no embedded banks. "
+ "Please load banks by using adl_openBankFile() or "
+ "adl_openBankData() functions instead of adl_loadEmbeddedBank().");
+ return -1;
+#else
+ if(num < 0 || num >= maxAdlBanks())
+ return -1;
+
+ OPL3::BankMap::iterator it = OPL3::BankMap::iterator::from_ptrs(bank->pointer);
+ size_t id = it->first;
+
+ for (unsigned i = 0; i < 128; ++i) {
+ size_t insno = i + ((id & OPL3::PercussionTag) ? 128 : 0);
+ size_t adlmeta = ::banks[num][insno];
+ it->second.ins[i] = adlinsdata2::from_adldata(::adlins[adlmeta]);
+ }
+ return 0;
+#endif
+}
+
ADLMIDI_EXPORT int adl_setNumFourOpsChn(ADL_MIDIPlayer *device, int ops4)
{
if(!device)
@@ -404,6 +447,16 @@ ADLMIDI_EXPORT void adl_setLoopEnabled(ADL_MIDIPlayer *device, int loopEn)
#endif
}
+ADLMIDI_EXPORT void adl_setSoftPanEnabled(ADL_MIDIPlayer *device, int softPanEn)
+{
+ if(!device)
+ return;
+ MidiPlayer *play = GET_MIDI_PLAYER(device);
+ if(!play)
+ return;
+ play->m_synth.m_softPanning = (softPanEn != 0);
+}
+
/* !!!DEPRECATED!!! */
ADLMIDI_EXPORT void adl_setLogarithmicVolumes(struct ADL_MIDIPlayer *device, int logvol)
{
@@ -560,10 +613,10 @@ ADLMIDI_EXPORT int adl_switchEmulator(struct ADL_MIDIPlayer *device, int emulato
assert(play);
if(!play)
return -1;
- if((emulator >= 0) && (emulator < ADLMIDI_EMU_end))
+ if(adl_isEmulatorAvailable(emulator))
{
play->m_setup.emulator = emulator;
- adl_reset(device);
+ play->partialReset();
return 0;
}
play->setErrorString("OPL3 MIDI: Unknown emulation core!");
@@ -580,7 +633,7 @@ ADLMIDI_EXPORT int adl_setRunAtPcmRate(ADL_MIDIPlayer *device, int enabled)
if(play)
{
play->m_setup.runAtPcmRate = (enabled != 0);
- adl_reset(device);
+ play->partialReset();
return 0;
}
}
@@ -617,33 +670,12 @@ ADLMIDI_EXPORT const char *adl_errorInfo(struct ADL_MIDIPlayer *device)
return play->getErrorString().c_str();
}
-ADLMIDI_EXPORT const char *adl_getMusicTitle(struct ADL_MIDIPlayer *device)
-{
- return adl_metaMusicTitle(device);
-}
-
-ADLMIDI_EXPORT void adl_close(struct ADL_MIDIPlayer *device)
-{
- if(!device)
- return;
- MIDIplay * play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
- if(play)
- delete play;
- device->adl_midiPlayer = NULL;
- free(device);
- device = NULL;
-}
-
ADLMIDI_EXPORT void adl_reset(struct ADL_MIDIPlayer *device)
{
if(!device)
return;
MidiPlayer *play = GET_MIDI_PLAYER(device);
- play->m_setup.tick_skip_samples_delay = 0;
- play->m_synth.m_runAtPcmRate = play->m_setup.runAtPcmRate;
- play->m_synth.reset(play->m_setup.emulator, play->m_setup.PCM_RATE, play);
- play->m_chipChannels.clear();
- play->m_chipChannels.resize((size_t)play->m_synth.m_numChannels);
+ play->partialReset();
play->resetMIDI();
}
@@ -757,6 +789,18 @@ ADLMIDI_EXPORT void adl_setTempo(struct ADL_MIDIPlayer *device, double tempo)
}
+ADLMIDI_EXPORT int adl_describeChannels(struct ADL_MIDIPlayer *device, char *str, char *attr, size_t size)
+{
+ if(!device)
+ return -1;
+ MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer);
+ if(!play)
+ return -1;
+ play->describeChannels(str, attr, size);
+ return 0;
+}
+
+
ADLMIDI_EXPORT const char *adl_metaMusicTitle(struct ADL_MIDIPlayer *device)
{
#ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER
@@ -1281,7 +1325,7 @@ ADLMIDI_EXPORT int adl_generateFormat(struct ADL_MIDIPlayer *device, int sampleC
#endif
}
-ADLMIDI_EXPORT double adl_tickEvents(struct ADL_MIDIPlayer *device, double seconds, double granuality)
+ADLMIDI_EXPORT double adl_tickEvents(struct ADL_MIDIPlayer *device, double seconds, double granulality)
{
#ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER
if(!device)
@@ -1289,11 +1333,11 @@ ADLMIDI_EXPORT double adl_tickEvents(struct ADL_MIDIPlayer *device, double secon
MidiPlayer *play = GET_MIDI_PLAYER(device);
if(!play)
return -1.0;
- return play->Tick(seconds, granuality);
+ return play->Tick(seconds, granulality);
#else
ADL_UNUSED(device);
ADL_UNUSED(seconds);
- ADL_UNUSED(granuality);
+ ADL_UNUSED(granulality);
return -1.0;
#endif
}
@@ -1313,6 +1357,82 @@ ADLMIDI_EXPORT int adl_atEnd(struct ADL_MIDIPlayer *device)
#endif
}
+ADLMIDI_EXPORT size_t adl_trackCount(struct ADL_MIDIPlayer *device)
+{
+#ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER
+ if(!device)
+ return 0;
+ MidiPlayer *play = GET_MIDI_PLAYER(device);
+ if(!play)
+ return 0;
+ return play->m_sequencer.getTrackCount();
+#else
+ ADL_UNUSED(device);
+ return 0;
+#endif
+}
+
+ADLMIDI_EXPORT int adl_setTrackOptions(struct ADL_MIDIPlayer *device, size_t trackNumber, unsigned trackOptions)
+{
+#ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER
+ if(!device)
+ return -1;
+ MidiPlayer *play = GET_MIDI_PLAYER(device);
+ if(!play)
+ return -1;
+ MidiSequencer &seq = play->m_sequencer;
+
+ unsigned enableFlag = trackOptions & 3;
+ trackOptions &= ~3u;
+
+ // handle on/off/solo
+ switch(enableFlag)
+ {
+ default:
+ break;
+ case ADLMIDI_TrackOption_On:
+ case ADLMIDI_TrackOption_Off:
+ if(!seq.setTrackEnabled(trackNumber, enableFlag == ADLMIDI_TrackOption_On))
+ return -1;
+ break;
+ case ADLMIDI_TrackOption_Solo:
+ seq.setSoloTrack(trackNumber);
+ break;
+ }
+
+ // handle others...
+ if(trackOptions != 0)
+ return -1;
+
+ return 0;
+
+#else
+ ADL_UNUSED(device);
+ ADL_UNUSED(trackNumber);
+ ADL_UNUSED(trackOptions);
+ return -1;
+#endif
+}
+
+ADLMIDI_EXPORT int adl_setTriggerHandler(struct ADL_MIDIPlayer *device, ADL_TriggerHandler handler, void *userData)
+{
+#ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER
+ if(!device)
+ return -1;
+ MidiPlayer *play = GET_MIDI_PLAYER(device);
+ if(!play)
+ return -1;
+ MidiSequencer &seq = play->m_sequencer;
+ seq.setTriggerHandler(handler, userData);
+ return 0;
+#else
+ ADL_UNUSED(device);
+ ADL_UNUSED(handler);
+ ADL_UNUSED(userData);
+ return -1;
+#endif
+}
+
ADLMIDI_EXPORT void adl_panic(struct ADL_MIDIPlayer *device)
{
if(!device)