From 778138971f75f5648c26f5d6583104c16ce276da Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Tue, 27 Jun 2023 10:15:14 +0000 Subject: [PATCH] midi: play c major scale TIMA occurs at half the speed predicted in the SCSP manual in mednafen, but at the correct speed in Kronos. I don't know which is correct. --- .gitignore | 1 + Makefile | 6 +- m68k/Makefile | 18 +- m68k/midi.cpp | 262 +++++++++++++++ {midi => m68k}/midi_test-c-major-scale.mid | Bin m68k/res | 1 + m68k/sine-44100-s16be-1ch.pcm | 1 - math/fp.hpp | 8 + midi/dump.cpp | 54 ++- midi/interpreter.py | 17 + midi/parse.cpp | 10 +- midi/parse.su | 372 +++++++++++++++++++++ scsp/fm.cpp | 22 +- scsp/{midi.cpp => sound_cpu__midi.cpp} | 76 +++-- 14 files changed, 809 insertions(+), 39 deletions(-) create mode 100644 m68k/midi.cpp rename {midi => m68k}/midi_test-c-major-scale.mid (100%) create mode 120000 m68k/res delete mode 120000 m68k/sine-44100-s16be-1ch.pcm create mode 100644 midi/interpreter.py create mode 100644 midi/parse.su rename scsp/{midi.cpp => sound_cpu__midi.cpp} (81%) diff --git a/.gitignore b/.gitignore index ccbd7a5..6c08c3d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.png *.out *.pcm +*.su res/mai.data tools/ttf-convert tools/ttf-bitmap diff --git a/Makefile b/Makefile index 641c935..74f44b1 100644 --- a/Makefile +++ b/Makefile @@ -108,20 +108,20 @@ scsp/%-44100-s16be-1ch-100sample.pcm: synth 100s $* 440 vol -10dB mv $@.raw $@ -scsp/slot.elf: scsp/slot.o scsp/sine-44100-s16be-1ch-1sec.pcm.o - m68k: m68k/%.bin: m68k $(MAKE) -C m68k $(notdir $@) +scsp/slot.elf: scsp/slot.o scsp/sine-44100-s16be-1ch-1sec.pcm.o + scsp/sound_cpu__slot.elf: scsp/sound_cpu__slot.o m68k/slot.bin.o scsp/sound_cpu__interrupt.elf: scsp/sound_cpu__interrupt.o m68k/interrupt.bin.o sh/lib1funcs.o res/sperrypc.font.bin.o common/draw_font.o common/palette.o scsp/fm.elf: scsp/fm.o res/nec.bitmap.bin.o sh/lib1funcs.o saturn/start.o scsp/sine-44100-s16be-1ch-100sample.pcm.o -scsp/midi.elf: scsp/midi.o res/nec.bitmap.bin.o sh/lib1funcs.o saturn/start.o scsp/sine-44100-s16be-1ch-100sample.pcm.o +scsp/sound_cpu__midi.elf: scsp/sound_cpu__midi.o m68k/midi.bin.o res/nec.bitmap.bin.o sh/lib1funcs.o saturn/start.o res/sperrypc.bitmap.bin: tools/ttf-bitmap ./tools/ttf-bitmap 20 7f res/Bm437_SperryPC_CGA.otb $@ diff --git a/m68k/Makefile b/m68k/Makefile index bea722a..90dd283 100644 --- a/m68k/Makefile +++ b/m68k/Makefile @@ -1,14 +1,28 @@ -CFLAGS = -I../saturn -OPT = -Og +CFLAGS = -I../saturn -fstack-usage +OPT = -O0 +LIBGCC = $(shell $(CC) -print-file-name=libgcc.a) LIB = ../saturn all: include $(LIB)/m68k/common.mk +# 200 bytes +%-44100-s16be-1ch-100sample.pcm: Makefile + sox \ + -r 44100 -e signed-integer -b 16 -c 1 -n -B \ + $@.raw \ + synth 100s $* 440 vol -10dB + mv $@.raw $@ + %.pcm.o: %.pcm $(BUILD_BINARY_O) +%.mid.o: %.mid + $(BUILD_BINARY_O) + slot.elf: slot.o sine-44100-s16be-1ch-1sec.pcm.o interrupt.elf: interrupt.o jojo-11025-s16be-1ch.pcm.o + +midi.elf: midi.o sine-44100-s16be-1ch-100sample.pcm.o midi_test-c-major-scale.mid.o ../midi/parse.o $(LIBGCC) diff --git a/m68k/midi.cpp b/m68k/midi.cpp new file mode 100644 index 0000000..2128438 --- /dev/null +++ b/m68k/midi.cpp @@ -0,0 +1,262 @@ +#include +#include + +#include "scsp.h" +#include "../math/fp.hpp" +#include "../midi/parse.hpp" +#include "../common/copy.hpp" + +extern void * _sine_start __asm("_binary_sine_44100_s16be_1ch_100sample_pcm_start"); +extern void * _midi_start __asm("_binary_midi_test_c_major_scale_mid_start"); + +uint16_t +midi_note_to_oct_fns(const int8_t midi_note) +{ + static const uint16_t _cent_to_fns[] = { + 0x0, + 0x3d, + 0x7d, + 0xc2, + 0x10a, + 0x157, + 0x1a8, + 0x1fe, + 0x25a, + 0x2ba, + 0x321, + 0x38d, + }; + + const int8_t a440_note = midi_note - 69; + const int8_t a440_note_d = (a440_note < 0) ? a440_note - 11 : a440_note; + const int8_t div12 = a440_note_d / static_cast(12); + const int8_t mod12 = a440_note % static_cast(12); + + const uint16_t oct = div12; + const uint16_t cent = (a440_note < 0) ? 12 + mod12 : mod12; + const uint16_t fns = _cent_to_fns[cent]; + + return PITCH__OCT(oct) | PITCH__FNS(fns); +} + +// maximum delay of 3258 days +using fp48_16 = fp; + +constexpr uint8_t tactl = 7; // F/128 +constexpr uint8_t tima = 0xfe; + +constexpr fp48_16 increment_ms{2902, 32394}; // 2902.494293212890625 + +struct midi_state { + uint8_t const * buf; + midi::header_t header; + struct track { + uint8_t const * start; + int32_t length; + } current_track; + + struct midi { + uint32_t tempo; + } midi; + + fp48_16 delta_time_ms; +}; + +static midi_state state = {0}; + +[[noreturn]] +void error() +{ + const uint32_t sine_start = reinterpret_cast(&_sine_start); + + { + scsp_slot& slot = scsp.reg.slot[0]; + // start address (bytes) + slot.SA = SA__KYONB | SA__LPCTL__NORMAL | SA__SA(sine_start); // kx kb sbctl[1:0] ssctl[1:0] lpctl[1:0] 8b sa[19:0] + slot.LSA = 0; // loop start address (samples) + slot.LEA = 99; // loop end address (samples) + slot.EG = EG__EGHOLD; // d2r d1r ho ar krs dl rr + slot.FM = 0; // stwinh sdir tl mdl mdxsl mdysl + //slot.PITCH = PITCH__OCT(0) | PITCH__FNS(0); // oct fns + slot.PITCH = 0x78c2; + slot.LFO = 0; // lfof plfows + slot.MIXER = MIXER__DISDL(0b110); // disdl dipan efsdl efpan + } + + { + scsp_slot& slot = scsp.reg.slot[1]; + // start address (bytes) + slot.SA = SA__KYONB | SA__LPCTL__NORMAL | SA__SA(sine_start); // kx kb sbctl[1:0] ssctl[1:0] lpctl[1:0] 8b sa[19:0] + slot.LSA = 0; // loop start address (samples) + slot.LEA = 99; // loop end address (samples) + slot.EG = EG__EGHOLD; // d2r d1r ho ar krs dl rr + slot.FM = 0; // stwinh sdir tl mdl mdxsl mdysl + slot.PITCH = PITCH__OCT(1) | PITCH__FNS(0); // oct fns + slot.LFO = 0; // lfof plfows + slot.MIXER = MIXER__DISDL(0b110); // disdl dipan efsdl efpan + } + + scsp.reg.slot[0].LOOP |= LOOP__KYONEX; + + while (1); +} + +fp48_16 delay_ms(uint32_t delta_time) +{ + return {(delta_time * state.midi.tempo) / + state.header.division.metrical.ticks_per_quarter_note}; +} + +static int _event = 0; + +static volatile int timer_fired = 0; + +extern "C" +void auto_vector_1(void) __attribute__ ((interrupt_handler)); +void auto_vector_1(void) +{ + // reset TIMER_A interrupt + scsp.reg.ctrl.SCIRE = INT__TIMER_A; + scsp.reg.ctrl.TIMA = TIMA__TACTL(tactl) | TIMA__TIMA(tima); + + timer_fired = 1; +} + +void midi_step() +{ + const uint32_t sine_start = reinterpret_cast(&_sine_start); + // 11.2896 MHz + + // 2902.4943 µs per interrupt this gives us 32768 cycles per + // interrupt, which *might* be roomy enough. + + int kyonex = 0; + + while (true) { + scsp.ram.u32[0] = _event; + scsp.ram.u32[1] = state.delta_time_ms.value >> 16; + + if (!(state.buf - state.current_track.start < state.current_track.length)) + return; + + auto mtrk_event_o = midi::parse::mtrk_event(state.buf); + if (!mtrk_event_o) error(); + midi::mtrk_event_t mtrk_event; + uint8_t const * buf; + std::tie(buf, mtrk_event) = *mtrk_event_o; + + scsp.ram.u32[2] = delay_ms(mtrk_event.delta_time).value >> 16; + + fp48_16 delta_time_ms{0}; + if (mtrk_event.delta_time != 0 && + state.delta_time_ms.value < (delta_time_ms = delay_ms(mtrk_event.delta_time)).value) + break; + else + state.buf = buf; + + _event++; + + switch (mtrk_event.event.type) { + case midi::event_t::type_t::midi: + { + midi::midi_event_t& midi_event = mtrk_event.event.event.midi; + + switch (midi_event.type) { + case midi::midi_event_t::type_t::note_on: + { + scsp_slot& slot = scsp.reg.slot[0]; + + scsp.ram.u32[3] = midi_event.data.note_on.note; + + //slot.SA = SA__KYONB | SA__LPCTL__NORMAL | SA__SA(sine_start); + slot.LOOP = LOOP__KYONB | LOOP__LPCTL__NORMAL | SAH__SA(sine_start); + slot.SAL = SAL__SA(sine_start); + slot.LSA = 0; + slot.LEA = 99; + slot.EG = EG__EGHOLD; //EG__AR(0x0f) | EG__D1R(0x4) | EG__D2R(0x4) | EG__RR(0x1f); + slot.FM = 0; + slot.PITCH = midi_note_to_oct_fns(midi_event.data.note_on.note); + slot.LFO = 0; + slot.MIXER = MIXER__DISDL(0b110); + + kyonex = 1; + } + break; + case midi::midi_event_t::type_t::note_off: + { + scsp_slot& slot = scsp.reg.slot[0]; + slot.LOOP = 0; + scsp.reg.slot[0].SA |= SA__KYONEX; + + kyonex = 1; + } + break; + default: + break; + } + } + break; + + default: + break; + } + + state.delta_time_ms -= delta_time_ms; + } + + if (kyonex) { + scsp.reg.slot[0].SA |= SA__KYONEX; + } + + state.delta_time_ms += increment_ms; +} + + +void init_midi() +{ + state.buf = reinterpret_cast(&_midi_start); + + auto header_o = midi::parse::header(state.buf); + if (!header_o) error(); + std::tie(state.buf, state.header) = *header_o; + + auto track_o = midi::parse::track(state.buf); + if (!track_o) error(); + std::tie(state.buf, state.current_track.length) = *track_o; + state.current_track.start = state.buf; + + state.delta_time_ms = fp48_16{0}; + state.midi.tempo = 500000; // default tempo +} + +void main() +{ + _event = 0; + scsp.ram.u32[0] = _event; + + for (long i = 0; i < 3200; i++) { asm volatile ("nop"); } // wait for (way) more than 30µs + + init_midi(); + + // timer A is vector 1 (0b001) + scsp.reg.ctrl.SCILV2 = 0; + scsp.reg.ctrl.SCILV1 = 0; + scsp.reg.ctrl.SCILV0 = SCILV__TIMER_A; + + // enable TIMER_A + scsp.reg.ctrl.SCIRE = INT__TIMER_A; + scsp.reg.ctrl.SCIEB = INT__TIMER_A; + + scsp.reg.ctrl.TIMA = TIMA__TACTL(tactl) | TIMA__TIMA(tima); + + asm volatile ("move.w #8192,%sr"); + + while (1) { + while (timer_fired == 0) { + asm volatile ("nop"); + } + + timer_fired = 0; + midi_step(); + } +} diff --git a/midi/midi_test-c-major-scale.mid b/m68k/midi_test-c-major-scale.mid similarity index 100% rename from midi/midi_test-c-major-scale.mid rename to m68k/midi_test-c-major-scale.mid diff --git a/m68k/res b/m68k/res new file mode 120000 index 0000000..85ee702 --- /dev/null +++ b/m68k/res @@ -0,0 +1 @@ +../res \ No newline at end of file diff --git a/m68k/sine-44100-s16be-1ch.pcm b/m68k/sine-44100-s16be-1ch.pcm deleted file mode 120000 index 835e5d1..0000000 --- a/m68k/sine-44100-s16be-1ch.pcm +++ /dev/null @@ -1 +0,0 @@ -../scsp/sine-44100-s16be-1ch.pcm \ No newline at end of file diff --git a/math/fp.hpp b/math/fp.hpp index df45583..c0cc874 100644 --- a/math/fp.hpp +++ b/math/fp.hpp @@ -10,10 +10,18 @@ struct fp { T value; + constexpr inline fp() noexcept + : value(0) + {} + constexpr inline fp(T n) noexcept : value(n * (1 << B)) {} + constexpr inline fp(T n, T d) noexcept + : value(n * (1 << B) + d) + {} + constexpr inline explicit fp(T n, struct fp_raw_tag) noexcept : value(n) {} diff --git a/midi/dump.cpp b/midi/dump.cpp index d78e8e3..91b3413 100644 --- a/midi/dump.cpp +++ b/midi/dump.cpp @@ -2,10 +2,57 @@ #include #include #include +#include #include "parse.hpp" #include "strings.hpp" +static uint16_t _cent_to_fns[] = { + 0x0, + 0x3d, + 0x7d, + 0xc2, + 0x10a, + 0x157, + 0x1a8, + 0x1fe, + 0x25a, + 0x2ba, + 0x321, + 0x38d, +}; + +constexpr std::tuple +midi_note_to_oct_fns(const int32_t midi_note) +{ + int32_t a440_note = midi_note - 69; + uint16_t oct = (a440_note / 12) & 0xf; + uint32_t cent = static_cast(a440_note) % 12; + uint16_t fns = _cent_to_fns[cent]; + return {oct, fns}; +} + +void +dump_midi(midi::midi_event_t& midi_event) +{ + switch (midi_event.type) { + case midi::midi_event_t::type_t::note_on: + { + std::cout << " note_on " << (int)midi_event.data.note_on.note << '\n'; + auto&& [oct, fns] = midi_note_to_oct_fns(midi_event.data.note_on.note); + std::cout << " oct " << oct << " fns " << fns << '\n'; + } + break; + case midi::midi_event_t::type_t::note_off: + { + std::cout << " note_off " << (int)midi_event.data.note_on.note << '\n'; + } + break; + default: + break; + } +} + int parse(uint8_t const * start) { uint8_t const * buf = &start[0]; @@ -56,6 +103,10 @@ int parse(uint8_t const * start) switch (mtrk_event.event.type) { case midi::event_t::type_t::midi: std::cout << " midi: " << '\n'; + + dump_midi(mtrk_event.event.event.midi); + + break; case midi::event_t::type_t::sysex: std::cout << " sysex: " << '\n'; @@ -69,8 +120,9 @@ int parse(uint8_t const * start) } assert(buf - track_start == track_length); + std::cout << "trailing/unparsed data: " << buf - track_start << '\n'; } - std::cout << "trailing/unparsed data: " << size - (buf - start) << '\n'; + return 0; } int main(int argc, char *argv[]) diff --git a/midi/interpreter.py b/midi/interpreter.py new file mode 100644 index 0000000..634c31a --- /dev/null +++ b/midi/interpreter.py @@ -0,0 +1,17 @@ +from dataclasses import dataclass + +def note_freq(n): + return 440 * 2 ** ((n-69)/12) + +@dataclass +class State: + tempo: int = 500000 # µS/qn + division: int = 96 # ticks/qn + +state = State() + +def delay(dt # microseconds + ) -> int: # in microseconds + return int((dt * state.tempo) / state.division) + +print(delay(96)) diff --git a/midi/parse.cpp b/midi/parse.cpp index 046613f..d4b3dde 100644 --- a/midi/parse.cpp +++ b/midi/parse.cpp @@ -24,11 +24,11 @@ int_variable_length(buf_t buf) return std::nullopt; } -static constexpr inline std::tuple +static inline std::tuple int_fixed_length16(buf_t buf) { uint16_t n; - if constexpr (std::endian::native == std::endian::big) { + if (0) {// constexpr (std::endian::native == std::endian::big) { n = *reinterpret_cast(buf); } else { n = (buf[0] << 8 | buf[1] << 0); @@ -36,11 +36,11 @@ int_fixed_length16(buf_t buf) return {buf + (sizeof (uint16_t)), n}; } -static constexpr inline std::tuple +static inline std::tuple int_fixed_length32(buf_t buf) { uint32_t n; - if constexpr (std::endian::native == std::endian::big) { + if (0) {//constexpr (std::endian::native == std::endian::big) { n = *reinterpret_cast(buf); } else { n = (buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3] << 0); @@ -60,7 +60,7 @@ header_chunk_type(buf_t buf) return std::nullopt; } -static constexpr inline std::tuple +static inline std::tuple division(buf_t buf) { uint16_t n; diff --git a/midi/parse.su b/midi/parse.su new file mode 100644 index 0000000..1278582 --- /dev/null +++ b/midi/parse.su @@ -0,0 +1,372 @@ +/usr/local/m68k-none-elf/include/c++/13.1.0/m68k-none-elf/bits/c++config.h:540:3:constexpr bool std::__is_constant_evaluated() 0 static +../midi/parse.cpp:12:1:constexpr std::optional > midi::parse::int_variable_length(buf_t) 48 dynamic,bounded +../midi/parse.cpp:28:1:std::tuple midi::parse::int_fixed_length16(buf_t) 24 dynamic,bounded +../midi/parse.cpp:40:1:std::tuple midi::parse::int_fixed_length32(buf_t) 24 dynamic,bounded +../midi/parse.cpp:52:1:constexpr std::optional midi::parse::header_chunk_type(buf_t) 16 dynamic,bounded +../midi/parse.cpp:64:1:std::tuple midi::parse::division(buf_t) 44 dynamic,bounded +../midi/parse.cpp:82:1:std::optional > midi::parse::header(buf_t) 128 dynamic,bounded +../midi/parse.cpp:107:1:constexpr std::optional > midi::parse::midi_event_type(buf_t) 120 dynamic,bounded +../midi/parse.cpp:128:1:constexpr int32_t midi::parse::midi_event_message_length(midi::midi_event_t::type_t) 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:984:26:constexpr std::optional<_Tp>::operator bool() const [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:470:22:constexpr bool std::_Optional_base_impl<_Tp, _Dp>::_M_is_engaged() const [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 0 static +../midi/parse.cpp:137:1:constexpr std::optional > midi::parse::midi_event(buf_t) 60 dynamic,bounded +../midi/parse.cpp:159:1:constexpr std::optional > midi::parse::sysex_event(buf_t) 68 dynamic,bounded +../midi/parse.cpp:171:1:constexpr std::optional > midi::parse::meta_event(buf_t) 72 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:984:26:constexpr std::optional<_Tp>::operator bool() const [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:470:22:constexpr bool std::_Optional_base_impl<_Tp, _Dp>::_M_is_engaged() const [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 0 static +../midi/parse.cpp:184:1:constexpr std::optional > midi::parse::event(buf_t) 212 dynamic,bounded +../midi/parse.cpp:204:1:std::optional > midi::parse::mtrk_event(buf_t) 128 dynamic,bounded +../midi/parse.cpp:219:1:constexpr std::optional midi::parse::track_chunk_type(buf_t) 16 dynamic,bounded +../midi/parse.cpp:231:1:std::optional > midi::parse::track(buf_t) 56 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1338:2:constexpr std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&) [with _U1 = const unsigned char*; _U2 = long unsigned int&; typename std::enable_if()), _T1, _T2>::__is_implicitly_constructible<_U1, _U2>(), bool>::type = true; _T1 = const unsigned char*; _T2 = long unsigned int] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = std::tuple; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:399:7:constexpr std::_Optional_payload<_Tp, true, false, false>::_Optional_payload() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:600:17:constexpr std::_Optional_base<_Tp, true, false>::_Optional_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1338:2:constexpr std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&) [with _U1 = const unsigned char*; _U2 = short unsigned int&; typename std::enable_if()), _T1, _T2>::__is_implicitly_constructible<_U1, _U2>(), bool>::type = true; _T1 = const unsigned char*; _T2 = short unsigned int] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = const unsigned char*; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = const unsigned char*] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:341:7:constexpr std::_Optional_payload<_Tp, true, true, true>::_Optional_payload() [with _Tp = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:643:17:constexpr std::_Optional_base<_Tp, true, true>::_Optional_base() [with _Tp = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:2155:5:) [with _Elements = {const unsigned char*, short unsigned int}] 16 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1638:2:constexpr std::__enable_if_t<__assignable<_U1, _U2>(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(std::tuple<_U1, _U2>&&) [with _U1 = const unsigned char*; _U2 = short unsigned int; _T1 = const unsigned char*&; _T2 = short unsigned int&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*; _T2 = midi::division_t] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:984:26:constexpr std::optional<_Tp>::operator bool() const [with _Tp = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:399:7:constexpr std::_Optional_payload<_Tp, true, false, false>::_Optional_payload() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:600:17:constexpr std::_Optional_base<_Tp, true, false>::_Optional_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:973:7:constexpr _Tp& std::optional<_Tp>::operator*() & [with _Tp = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:2155:5:) [with _Elements = {const unsigned char*, long unsigned int}] 16 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1638:2:constexpr std::__enable_if_t<__assignable<_U1, _U2>(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(std::tuple<_U1, _U2>&&) [with _U1 = const unsigned char*; _U2 = long unsigned int; _T1 = const unsigned char*&; _T2 = long unsigned int&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:2155:5:) [with _Elements = {const unsigned char*, midi::division_t}] 16 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1638:2:constexpr std::__enable_if_t<__assignable<_U1, _U2>(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(std::tuple<_U1, _U2>&&) [with _U1 = const unsigned char*; _U2 = midi::division_t; _T1 = const unsigned char*&; _T2 = midi::division_t&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*; _T2 = midi::header_t] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = std::tuple; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1338:2:constexpr std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&) [with _U1 = const unsigned char*&; _U2 = midi::midi_event_t::type_t; typename std::enable_if()), _T1, _T2>::__is_implicitly_constructible<_U1, _U2>(), bool>::type = true; _T1 = const unsigned char*; _T2 = midi::midi_event_t::type_t] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = std::tuple; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:399:7:constexpr std::_Optional_payload<_Tp, true, false, false>::_Optional_payload() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:600:17:constexpr std::_Optional_base<_Tp, true, false>::_Optional_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:399:7:constexpr std::_Optional_payload<_Tp, true, false, false>::_Optional_payload() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:600:17:constexpr std::_Optional_base<_Tp, true, false>::_Optional_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:2155:5:) [with _Elements = {const unsigned char*, midi::midi_event_t::type_t}] 16 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:973:7:constexpr _Tp& std::optional<_Tp>::operator*() & [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1628:2:constexpr std::__enable_if_t<__assignable(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(const std::tuple<_U1, _U2>&) [with _U1 = const unsigned char*; _U2 = midi::midi_event_t::type_t; _T1 = const unsigned char*&; _T2 = midi::midi_event_t::type_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1338:2:constexpr std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&) [with _U1 = const unsigned char*&; _U2 = midi::midi_event_t&; typename std::enable_if()), _T1, _T2>::__is_implicitly_constructible<_U1, _U2>(), bool>::type = true; _T1 = const unsigned char*; _T2 = midi::midi_event_t] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = std::tuple; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:399:7:constexpr std::_Optional_payload<_Tp, true, false, false>::_Optional_payload() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:600:17:constexpr std::_Optional_base<_Tp, true, false>::_Optional_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:984:26:constexpr std::optional<_Tp>::operator bool() const [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:973:7:constexpr _Tp& std::optional<_Tp>::operator*() & [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1628:2:constexpr std::__enable_if_t<__assignable(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(const std::tuple<_U1, _U2>&) [with _U1 = const unsigned char*; _U2 = long unsigned int; _T1 = const unsigned char*&; _T2 = long unsigned int&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*; _T2 = midi::sysex_event_t] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = std::tuple; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:399:7:constexpr std::_Optional_payload<_Tp, true, false, false>::_Optional_payload() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:600:17:constexpr std::_Optional_base<_Tp, true, false>::_Optional_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*; _T2 = midi::meta_event_t] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = std::tuple; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:2155:5:) [with _Elements = {const unsigned char*, midi::midi_event_t}] 16 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:973:7:constexpr _Tp& std::optional<_Tp>::operator*() & [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1628:2:constexpr std::__enable_if_t<__assignable(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(const std::tuple<_U1, _U2>&) [with _U1 = const unsigned char*; _U2 = midi::midi_event_t; _T1 = const unsigned char*&; _T2 = midi::midi_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*; _T2 = midi::event_t] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = std::tuple; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:984:26:constexpr std::optional<_Tp>::operator bool() const [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:2155:5:) [with _Elements = {const unsigned char*, midi::meta_event_t}] 16 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:973:7:constexpr _Tp& std::optional<_Tp>::operator*() & [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1628:2:constexpr std::__enable_if_t<__assignable(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(const std::tuple<_U1, _U2>&) [with _U1 = const unsigned char*; _U2 = midi::meta_event_t; _T1 = const unsigned char*&; _T2 = midi::meta_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:984:26:constexpr std::optional<_Tp>::operator bool() const [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:2155:5:) [with _Elements = {const unsigned char*, midi::sysex_event_t}] 16 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:973:7:constexpr _Tp& std::optional<_Tp>::operator*() & [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1628:2:constexpr std::__enable_if_t<__assignable(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(const std::tuple<_U1, _U2>&) [with _U1 = const unsigned char*; _U2 = midi::sysex_event_t; _T1 = const unsigned char*&; _T2 = midi::sysex_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:399:7:constexpr std::_Optional_payload<_Tp, true, false, false>::_Optional_payload() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:600:17:constexpr std::_Optional_base<_Tp, true, false>::_Optional_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:120:7:constexpr std::_Optional_payload_base<_Tp>::_Optional_payload_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:399:7:constexpr std::_Optional_payload<_Tp, true, false, false>::_Optional_payload() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:600:17:constexpr std::_Optional_base<_Tp, true, false>::_Optional_base() [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:739:17:constexpr std::optional<_Tp>::optional(std::nullopt_t) [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:984:26:constexpr std::optional<_Tp>::operator bool() const [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:2155:5:) [with _Elements = {const unsigned char*, midi::event_t}] 16 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:973:7:constexpr _Tp& std::optional<_Tp>::operator*() & [with _Tp = std::tuple] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1628:2:constexpr std::__enable_if_t<__assignable(), std::tuple<_T1, _T2>&> std::tuple<_T1, _T2>::operator=(const std::tuple<_U1, _U2>&) [with _U1 = const unsigned char*; _U2 = midi::event_t; _T1 = const unsigned char*&; _T2 = midi::event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*; _T2 = midi::mtrk_event_t] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:747:2:constexpr std::optional<_Tp>::optional(_Up&&) [with _Up = std::tuple; typename std::enable_if<__and_v, typename std::remove_cv::type>::type> >, std::__not_::type>::type> >, std::is_constructible<_Tp, _Up>, std::is_convertible<_Iter, _Iterator> >, bool>::type = true; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1338:2:constexpr std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&) [with _U1 = const unsigned char*&; _U2 = long unsigned int&; typename std::enable_if()), _T1, _T2>::__is_implicitly_constructible<_U1, _U2>(), bool>::type = true; _T1 = const unsigned char*; _T2 = long unsigned int] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = const unsigned char*] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = long unsigned int&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:291:2:) [with _UHead = const unsigned char*; _UTail = {long unsigned int&}; = void; long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {long unsigned int}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:397:42:) [with _Args = {std::tuple}][inherited from std::_Optional_payload_base >] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:606:2:>, bool>::type = false; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = std::tuple; bool = true; _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = short unsigned int&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:291:2:) [with _UHead = const unsigned char*; _UTail = {short unsigned int&}; = void; long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {short unsigned int}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:339:42:) [with _Args = {const unsigned char*}][inherited from std::_Optional_payload_base] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:649:2:>, bool>::type = false; _Tp = const unsigned char*] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = const unsigned char*; bool = true; _Tp = const unsigned char*] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*&; _T2 = short unsigned int&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:104:5:constexpr typename std::remove_reference<_Tp>::type&& std::move(_Tp&&) [with _Tp = tuple&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:437:2:>&&) [with _UHead = const unsigned char*; _UTails = {short unsigned int}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {short unsigned int&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::division_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:470:22:constexpr bool std::_Optional_base_impl<_Tp, _Dp>::_M_is_engaged() const [with _Tp = const unsigned char*; _Dp = std::_Optional_base] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = std::tuple; bool = true; _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:475:7:constexpr _Tp& std::_Optional_base_impl<_Tp, _Dp>::_M_get() [with _Tp = const unsigned char*; _Dp = std::_Optional_base] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*&; _T2 = long unsigned int&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:104:5:constexpr typename std::remove_reference<_Tp>::type&& std::move(_Tp&&) [with _Tp = tuple&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:437:2:>&&) [with _UHead = const unsigned char*; _UTails = {long unsigned int}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {long unsigned int&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*&; _T2 = midi::division_t&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:104:5:constexpr typename std::remove_reference<_Tp>::type&& std::move(_Tp&&) [with _Tp = tuple&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:437:2:>&&) [with _UHead = const unsigned char*; _UTails = {midi::division_t}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::division_t&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::header_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:397:42:) [with _Args = {std::tuple}][inherited from std::_Optional_payload_base >] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:606:2:>, bool>::type = false; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = const unsigned char*&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = midi::midi_event_t::type_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:291:2:) [with _UHead = const unsigned char*&; _UTail = {midi::midi_event_t::type_t}; = void; long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::midi_event_t::type_t}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:397:42:) [with _Args = {std::tuple}][inherited from std::_Optional_payload_base >] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:606:2:>, bool>::type = false; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = std::tuple; bool = true; _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = std::tuple; bool = true; _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*&; _T2 = midi::midi_event_t::type_t&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:475:7:constexpr _Tp& std::_Optional_base_impl<_Tp, _Dp>::_M_get() [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:427:2:>&) [with _UElements = {const unsigned char*, midi::midi_event_t::type_t}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::midi_event_t::type_t&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = midi::midi_event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:291:2:) [with _UHead = const unsigned char*&; _UTail = {midi::midi_event_t&}; = void; long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::midi_event_t}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:397:42:) [with _Args = {std::tuple}][inherited from std::_Optional_payload_base >] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:606:2:>, bool>::type = false; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = std::tuple; bool = true; _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:470:22:constexpr bool std::_Optional_base_impl<_Tp, _Dp>::_M_is_engaged() const [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:475:7:constexpr _Tp& std::_Optional_base_impl<_Tp, _Dp>::_M_get() [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:427:2:>&) [with _UElements = {const unsigned char*, long unsigned int}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {long unsigned int&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::sysex_event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:397:42:) [with _Args = {std::tuple}][inherited from std::_Optional_payload_base >] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:606:2:>, bool>::type = false; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = std::tuple; bool = true; _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::meta_event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:397:42:) [with _Args = {std::tuple}][inherited from std::_Optional_payload_base >] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:606:2:>, bool>::type = false; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*&; _T2 = midi::midi_event_t&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:475:7:constexpr _Tp& std::_Optional_base_impl<_Tp, _Dp>::_M_get() [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:427:2:>&) [with _UElements = {const unsigned char*, midi::midi_event_t}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::midi_event_t&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:397:42:) [with _Args = {std::tuple}][inherited from std::_Optional_payload_base >] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:606:2:>, bool>::type = false; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:470:22:constexpr bool std::_Optional_base_impl<_Tp, _Dp>::_M_is_engaged() const [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*&; _T2 = midi::meta_event_t&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:475:7:constexpr _Tp& std::_Optional_base_impl<_Tp, _Dp>::_M_get() [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:427:2:>&) [with _UElements = {const unsigned char*, midi::meta_event_t}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::meta_event_t&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:470:22:constexpr bool std::_Optional_base_impl<_Tp, _Dp>::_M_is_engaged() const [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*&; _T2 = midi::sysex_event_t&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:475:7:constexpr _Tp& std::_Optional_base_impl<_Tp, _Dp>::_M_get() [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:427:2:>&) [with _UElements = {const unsigned char*, midi::sysex_event_t}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::sysex_event_t&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = std::tuple; bool = true; _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:209:14:constexpr std::_Optional_payload_base<_Tp>::_Storage<_Up, >::_Storage() [with _Up = std::tuple; bool = true; _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:470:22:constexpr bool std::_Optional_base_impl<_Tp, _Dp>::_M_is_engaged() const [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1324:2:constexpr std::tuple<_T1, _T2>::tuple(const _T1&, const _T2&) [with bool _Dummy = true; typename std::enable_if::__is_implicitly_constructible(), bool>::type = true; _T1 = const unsigned char*&; _T2 = midi::event_t&] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:475:7:constexpr _Tp& std::_Optional_base_impl<_Tp, _Dp>::_M_get() [with _Tp = std::tuple; _Dp = std::_Optional_base, true, false>] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:427:2:>&) [with _UElements = {const unsigned char*, midi::event_t}; long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::event_t&}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::mtrk_event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:397:42:) [with _Args = {std::tuple}][inherited from std::_Optional_payload_base >] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:606:2:>, bool>::type = false; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:291:2:) [with _UHead = const unsigned char*&; _UTail = {long unsigned int&}; = void; long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {long unsigned int}] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:513:2:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(_UHead&&) [with _UHead = long unsigned int&; long unsigned int _Idx = 1; _Head = long unsigned int] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:200:19:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(_UHead&&) [with _UHead = const unsigned char*; long unsigned int _Idx = 0; _Head = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {std::tuple}; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:513:2:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(_UHead&&) [with _UHead = short unsigned int&; long unsigned int _Idx = 1; _Head = short unsigned int] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {const unsigned char*}; _Tp = const unsigned char*] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {short unsigned int&}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {short unsigned int&}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {short unsigned int}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {short unsigned int&}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {short unsigned int}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:104:5:constexpr typename std::remove_reference<_Tp>::type&& std::move(_Tp&&) [with _Tp = _Tuple_impl<1, short unsigned int>&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:640:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(std::_Tuple_impl<_Idx, _UHead>&&) [with _UHead = short unsigned int; long unsigned int _Idx = 1; _Head = short unsigned int&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::division_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 0; _Head = const unsigned char*] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:306:7:constexpr _Tp& std::_Optional_payload_base<_Tp>::_M_get() [with _Tp = const unsigned char*] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {long unsigned int&}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {long unsigned int&}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {long unsigned int}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {long unsigned int&}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {long unsigned int}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:104:5:constexpr typename std::remove_reference<_Tp>::type&& std::move(_Tp&&) [with _Tp = _Tuple_impl<1, long unsigned int>&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:640:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(std::_Tuple_impl<_Idx, _UHead>&&) [with _UHead = long unsigned int; long unsigned int _Idx = 1; _Head = long unsigned int&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::division_t&}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::division_t&}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::division_t}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::division_t&}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::division_t}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:104:5:constexpr typename std::remove_reference<_Tp>::type&& std::move(_Tp&&) [with _Tp = _Tuple_impl<1, midi::division_t>&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:640:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(std::_Tuple_impl<_Idx, _UHead>&&) [with _UHead = midi::division_t; long unsigned int _Idx = 1; _Head = midi::division_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::header_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {std::tuple}; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:513:2:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(_UHead&&) [with _UHead = midi::midi_event_t::type_t; long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:200:19:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(_UHead&&) [with _UHead = const unsigned char*&; long unsigned int _Idx = 0; _Head = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {std::tuple}; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::midi_event_t::type_t&}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:306:7:constexpr _Tp& std::_Optional_payload_base<_Tp>::_M_get() [with _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::midi_event_t::type_t&}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:272:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::midi_event_t::type_t}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::midi_event_t::type_t&}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:278:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::midi_event_t::type_t}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:632:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(const std::_Tuple_impl<_Idx, _UHead>&) [with _UHead = midi::midi_event_t::type_t; long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:513:2:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(_UHead&&) [with _UHead = midi::midi_event_t&; long unsigned int _Idx = 1; _Head = midi::midi_event_t] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {std::tuple}; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:306:7:constexpr _Tp& std::_Optional_payload_base<_Tp>::_M_get() [with _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:272:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {long unsigned int}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:278:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {long unsigned int}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:632:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(const std::_Tuple_impl<_Idx, _UHead>&) [with _UHead = long unsigned int; long unsigned int _Idx = 1; _Head = long unsigned int&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {std::tuple}; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {std::tuple}; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::midi_event_t&}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:306:7:constexpr _Tp& std::_Optional_payload_base<_Tp>::_M_get() [with _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::midi_event_t&}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:272:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::midi_event_t}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::midi_event_t&}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:278:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::midi_event_t}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:632:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(const std::_Tuple_impl<_Idx, _UHead>&) [with _UHead = midi::midi_event_t; long unsigned int _Idx = 1; _Head = midi::midi_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {std::tuple}; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::meta_event_t&}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:306:7:constexpr _Tp& std::_Optional_payload_base<_Tp>::_M_get() [with _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::meta_event_t&}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:272:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::meta_event_t}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::meta_event_t&}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:278:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::meta_event_t}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:632:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(const std::_Tuple_impl<_Idx, _UHead>&) [with _UHead = midi::meta_event_t; long unsigned int _Idx = 1; _Head = midi::meta_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::sysex_event_t&}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:306:7:constexpr _Tp& std::_Optional_payload_base<_Tp>::_M_get() [with _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::sysex_event_t&}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:272:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::sysex_event_t}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::sysex_event_t&}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:278:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::sysex_event_t}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:632:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(const std::_Tuple_impl<_Idx, _UHead>&) [with _UHead = midi::sysex_event_t; long unsigned int _Idx = 1; _Head = midi::sysex_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:284:7:) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::event_t&}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:306:7:constexpr _Tp& std::_Optional_payload_base<_Tp>::_M_get() [with _Tp = std::tuple] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:269:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::event_t&}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:272:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::event_t}] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:275:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&; _Tail = {midi::event_t&}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:278:7:>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::event_t}] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:632:2:constexpr void std::_Tuple_impl<_Idx, _Head>::_M_assign(const std::_Tuple_impl<_Idx, _UHead>&) [with _UHead = midi::event_t; long unsigned int _Idx = 1; _Head = midi::event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::mtrk_event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:125:2:) [with _Args = {std::tuple}; _Tp = std::tuple] 20 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:200:19:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(_UHead&&) [with _UHead = long unsigned int&; long unsigned int _Idx = 1; _Head = long unsigned int] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:302:7:>&&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {long unsigned int}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1351:17:constexpr std::tuple<_T1, _T2>::tuple(std::tuple<_T1, _T2>&&) [with _T1 = const unsigned char*; _T2 = long unsigned int] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {std::tuple}; _Up = std::tuple; bool = true; _Tp = std::tuple] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:200:19:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(_UHead&&) [with _UHead = short unsigned int&; long unsigned int _Idx = 1; _Head = short unsigned int] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {const unsigned char*}; _Up = const unsigned char*; bool = true; _Tp = const unsigned char*] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = short unsigned int&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = short unsigned int&] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = short unsigned int] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = short unsigned int] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::division_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = long unsigned int&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = long unsigned int&] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = long unsigned int] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = long unsigned int] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::division_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::division_t&] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::division_t] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/bits/move.h:77:5:constexpr _Tp&& std::forward(typename remove_reference<_Functor>::type&) [with _Tp = midi::division_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::header_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:302:7:>&&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::header_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1351:17:constexpr std::tuple<_T1, _T2>::tuple(std::tuple<_T1, _T2>&&) [with _T1 = const unsigned char*; _T2 = midi::header_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {std::tuple}; _Up = std::tuple; bool = true; _Tp = std::tuple] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:200:19:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(_UHead&&) [with _UHead = midi::midi_event_t::type_t; long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:302:7:>&&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::midi_event_t::type_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1351:17:constexpr std::tuple<_T1, _T2>::tuple(std::tuple<_T1, _T2>&&) [with _T1 = const unsigned char*; _T2 = midi::midi_event_t::type_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {std::tuple}; _Up = std::tuple; bool = true; _Tp = std::tuple] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:237:7:static constexpr const _Head& std::_Head_base<_Idx, _Head, false>::_M_head(const std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 0; _Head = const unsigned char*] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t&] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:500:7:static constexpr const _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(const std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:200:19:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(_UHead&&) [with _UHead = midi::midi_event_t&; long unsigned int _Idx = 1; _Head = midi::midi_event_t] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:302:7:>&&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::midi_event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1351:17:constexpr std::tuple<_T1, _T2>::tuple(std::tuple<_T1, _T2>&&) [with _T1 = const unsigned char*; _T2 = midi::midi_event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {std::tuple}; _Up = std::tuple; bool = true; _Tp = std::tuple] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:500:7:static constexpr const _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(const std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = long unsigned int] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:302:7:>&&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::sysex_event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1351:17:constexpr std::tuple<_T1, _T2>::tuple(std::tuple<_T1, _T2>&&) [with _T1 = const unsigned char*; _T2 = midi::sysex_event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {std::tuple}; _Up = std::tuple; bool = true; _Tp = std::tuple] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:302:7:>&&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::meta_event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1351:17:constexpr std::tuple<_T1, _T2>::tuple(std::tuple<_T1, _T2>&&) [with _T1 = const unsigned char*; _T2 = midi::meta_event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {std::tuple}; _Up = std::tuple; bool = true; _Tp = std::tuple] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t&] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:500:7:static constexpr const _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(const std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:302:7:>&&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1351:17:constexpr std::tuple<_T1, _T2>::tuple(std::tuple<_T1, _T2>&&) [with _T1 = const unsigned char*; _T2 = midi::event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {std::tuple}; _Up = std::tuple; bool = true; _Tp = std::tuple] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t&] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:500:7:static constexpr const _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(const std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t&] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:500:7:static constexpr const _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(const std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:507:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::event_t&] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:497:7:static constexpr _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::event_t&] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:500:7:static constexpr const _Head& std::_Tuple_impl<_Idx, _Head>::_M_head(const std::_Tuple_impl<_Idx, _Head>&) [with long unsigned int _Idx = 1; _Head = midi::event_t] 4 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::mtrk_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:302:7:>&&) [with long unsigned int _Idx = 0; _Head = const unsigned char*; _Tail = {midi::mtrk_event_t}] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:1351:17:constexpr std::tuple<_T1, _T2>::tuple(std::tuple<_T1, _T2>&&) [with _T1 = const unsigned char*; _T2 = midi::mtrk_event_t] 8 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/optional:213:6:) [with _Args = {std::tuple}; _Up = std::tuple; bool = true; _Tp = std::tuple] 12 dynamic,bounded +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:527:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 1; _Head = long unsigned int] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = short unsigned int&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = short unsigned int&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = short unsigned int] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = long unsigned int&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = long unsigned int&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = long unsigned int] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::division_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::division_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::division_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:527:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 1; _Head = midi::header_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:527:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:237:7:static constexpr const _Head& std::_Head_base<_Idx, _Head, false>::_M_head(const std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t::type_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:527:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:237:7:static constexpr const _Head& std::_Head_base<_Idx, _Head, false>::_M_head(const std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = long unsigned int] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:527:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:527:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:237:7:static constexpr const _Head& std::_Head_base<_Idx, _Head, false>::_M_head(const std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::midi_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:527:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 1; _Head = midi::event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:237:7:static constexpr const _Head& std::_Head_base<_Idx, _Head, false>::_M_head(const std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::meta_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:237:7:static constexpr const _Head& std::_Head_base<_Idx, _Head, false>::_M_head(const std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::sysex_event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:193:17:constexpr std::_Head_base<_Idx, _Head, false>::_Head_base(const _Head&) [with long unsigned int _Idx = 1; _Head = midi::event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:234:7:static constexpr _Head& std::_Head_base<_Idx, _Head, false>::_M_head(std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::event_t&] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:237:7:static constexpr const _Head& std::_Head_base<_Idx, _Head, false>::_M_head(const std::_Head_base<_Idx, _Head, false>&) [with long unsigned int _Idx = 1; _Head = midi::event_t] 0 static +/usr/local/m68k-none-elf/include/c++/13.1.0/tuple:527:7:constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl(std::_Tuple_impl<_Idx, _Head>&&) [with long unsigned int _Idx = 1; _Head = midi::mtrk_event_t] 0 static diff --git a/scsp/fm.cpp b/scsp/fm.cpp index 9710ee7..ce673fb 100644 --- a/scsp/fm.cpp +++ b/scsp/fm.cpp @@ -658,6 +658,15 @@ void v_blank_in_int() void init_slots() { + while ((smpc.reg.SF & 1) != 0); + smpc.reg.SF = 1; + smpc.reg.COMREG = COMREG__SNDOFF; + while (smpc.reg.OREG[31].val != OREG31__SNDOFF); + + scsp.reg.ctrl.MIXER = MIXER__MEM4MB | MIXER__MVOL(0); + + for (long i = 0; i < 3200; i++) { asm volatile ("nop"); } // wait for (way) more than 30µs + /* The Saturn BIOS does not (un)initialize the DSP. Without zeroizing the DSP program, the SCSP DSP appears to have a program that continuously writes to @@ -670,11 +679,9 @@ void init_slots() while ((smpc.reg.SF & 1) != 0); smpc.reg.SF = 1; smpc.reg.COMREG = COMREG__SNDON; - while (smpc.reg.OREG[31].val != 0b00000110); + while (smpc.reg.OREG[31].val != OREG31__SNDON); - for (long i = 0; i < 807; i++) { asm volatile ("nop"); } // wait for (way) more than 30µs - - scsp.reg.ctrl.MIXER = MIXER__MEM4MB | MIXER__MVOL(0); + for (long i = 0; i < 3200; i++) { asm volatile ("nop"); } // wait for (way) more than 30µs const uint32_t * buf = reinterpret_cast(&_sine_start); const uint32_t size = reinterpret_cast(&_sine_size); @@ -683,12 +690,13 @@ void init_slots() for (int i = 0; i < 32; i++) { scsp_slot& slot = scsp.reg.slot[i]; // start address (bytes) - slot.SA = SA__KYONB | SA__LPCTL__NORMAL | SA__SA(0); // kx kb sbctl[1:0] ssctl[1:0] lpctl[1:0] 8b sa[19:0] + slot.SA = SA__LPCTL__NORMAL | SA__SA(0); // kx kb sbctl[1:0] ssctl[1:0] lpctl[1:0] 8b sa[19:0] slot.LSA = 0; // loop start address (samples) slot.LEA = 100; // loop end address (samples) - slot.EG = EG__EGHOLD; // d2r d1r ho ar krs dl rr + slot.EG = EG__AR(0x1f) | EG__RR(0x1f); // d2r d1r ho ar krs dl rr slot.FM = 0; // stwinh sdir tl mdl mdxsl mdysl - slot.PITCH = PITCH__OCT(0) | PITCH__FNS(0); // oct fns + //slot.PITCH = PITCH__OCT(-1) | PITCH__FNS(0xc2); // oct fns + slot.PITCH = 0x78c2; slot.LFO = 0; // lfof plfows slot.MIXER = MIXER__DISDL(0b101); // disdl dipan efsdl efpan } diff --git a/scsp/midi.cpp b/scsp/sound_cpu__midi.cpp similarity index 81% rename from scsp/midi.cpp rename to scsp/sound_cpu__midi.cpp index ae5a07b..f88de86 100644 --- a/scsp/midi.cpp +++ b/scsp/sound_cpu__midi.cpp @@ -12,8 +12,8 @@ #include "../common/vdp2_func.hpp" #include "../common/string.hpp" -extern void * _sine_start __asm("_binary_scsp_sine_44100_s16be_1ch_100sample_pcm_start"); -extern void * _sine_size __asm("_binary_scsp_sine_44100_s16be_1ch_100sample_pcm_size"); +extern void * _m68k_start __asm("_binary_m68k_midi_bin_start"); +extern void * _m68k_size __asm("_binary_m68k_midi_bin_size"); extern void * _nec_bitmap_start __asm("_binary_res_nec_bitmap_bin_start"); @@ -194,13 +194,38 @@ set_char(int32_t x, int32_t y, uint8_t palette, uint8_t c) | PATTERN_NAME_TABLE_1WORD__CHARACTER((c - 0x20)); } +static int render_state = 0; + void render() { + if (++render_state < 1) + return; + render_state = 0; + // 012345678901234 - uint8_t label[] = "midi"; + static uint8_t label[] = "midi"; for (uint32_t i = 0; label[i] != 0; i++) { set_char(0 + i, 1, 0, label[i]); } + + uint32_t i; + uint8_t buf[8]; + static uint8_t l1[] = "evnt"; + string::hex(buf, 8, scsp.ram.u32[0]); + for (i = 0; i < 4; i++) set_char(0 + i, 3, 0, l1[i]); + for (i = 0; i < 8; i++) set_char(5 + i, 3, 0, buf[i]); + static uint8_t l2[] = "s_dt"; + string::hex(buf, 8, scsp.ram.u32[1]); + for (i = 0; i < 4; i++) set_char(0 + i, 4, 0, l2[i]); + for (i = 0; i < 8; i++) set_char(5 + i, 4, 0, buf[i]); + static uint8_t l3[] = "e_dt"; + string::hex(buf, 8, scsp.ram.u32[2]); + for (i = 0; i < 4; i++) set_char(0 + i, 5, 0, l3[i]); + for (i = 0; i < 8; i++) set_char(5 + i, 5, 0, buf[i]); + static uint8_t l4[] = "note"; + string::hex(buf, 8, scsp.ram.u32[3]); + for (i = 0; i < 4; i++) set_char(0 + i, 6, 0, l4[i]); + for (i = 0; i < 8; i++) set_char(5 + i, 6, 0, buf[i]); } void update() @@ -216,7 +241,7 @@ void v_blank_in_int() // flip planes; vdp2.reg.MPABN0 = MPABN0__N0MPB(0) | MPABN0__N0MPA(plane_a + plane_ix); - plane_ix = !plane_ix; + //plane_ix = !plane_ix; // wait at least 300us, as specified in the SMPC manual. // It appears reading FRC.H is mandatory and *must* occur before FRC.L on real @@ -244,7 +269,7 @@ void v_blank_in_int() render(); } -void init_slots() +void init_snd_cpu() { /* The Saturn BIOS does not (un)initialize the DSP. Without zeroizing the DSP @@ -255,38 +280,49 @@ void init_slots() reg32 * dsp_steps = reinterpret_cast(&(scsp.reg.dsp.STEP[0].MPRO[0])); fill(dsp_steps, 0, (sizeof (scsp.reg.dsp.STEP))); + /* SEGA SATURN TECHNICAL BULLETIN # 51 + + The document suggests that Sound RAM is (somewhat) preserved + during SNDOFF. + */ + + scsp.reg.ctrl.MIXER = MIXER__MEM4MB; + + while ((smpc.reg.SF & 1) != 0); + smpc.reg.SF = 1; + smpc.reg.COMREG = COMREG__SNDOFF; + while (smpc.reg.OREG[31].val != OREG31__SNDOFF); + + uint32_t * m68k_main_start = reinterpret_cast(&_m68k_start); + uint32_t m68k_main_size = reinterpret_cast(&_m68k_size); + copy(&scsp.ram.u32[0], m68k_main_start, m68k_main_size); + while ((smpc.reg.SF & 1) != 0); smpc.reg.SF = 1; smpc.reg.COMREG = COMREG__SNDON; - while (smpc.reg.OREG[31].val != 0b00000110); - - for (long i = 0; i < 807; i++) { asm volatile ("nop"); } // wait for (way) more than 30µs - - scsp.reg.ctrl.MIXER = MIXER__MEM4MB | MIXER__MVOL(0); - - const uint32_t * buf = reinterpret_cast(&_sine_start); - const uint32_t size = reinterpret_cast(&_sine_size); - copy(&scsp.ram.u32[0], buf, size); + while (smpc.reg.OREG[31].val != OREG31__SNDON); for (int i = 0; i < 32; i++) { + break; scsp_slot& slot = scsp.reg.slot[i]; // start address (bytes) - slot.SA = SA__KYONB | SA__LPCTL__NORMAL | SA__SA(0); // kx kb sbctl[1:0] ssctl[1:0] lpctl[1:0] 8b sa[19:0] + slot.SA = 0; // kx kb sbctl[1:0] ssctl[1:0] lpctl[1:0] 8b sa[19:0] slot.LSA = 0; // loop start address (samples) - slot.LEA = 100; // loop end address (samples) - slot.EG = EG__EGHOLD; // d2r d1r ho ar krs dl rr + slot.LEA = 0; // loop end address (samples) + slot.EG = EG__RR(0x1f); // d2r d1r ho ar krs dl rr slot.FM = 0; // stwinh sdir tl mdl mdxsl mdysl - slot.PITCH = PITCH__OCT(0) | PITCH__FNS(0); // oct fns + slot.PITCH = 0; // oct fns slot.LFO = 0; // lfof plfows - slot.MIXER = MIXER__DISDL(0b101); // disdl dipan efsdl efpan + slot.MIXER = 0; // disdl dipan efsdl efpan } + //scsp.reg.slot[0].LOOP |= LOOP__KYONEX; scsp.reg.ctrl.MIXER = MIXER__MEM4MB | MIXER__MVOL(0xf); } void main() { - init_slots(); + init_snd_cpu(); v_blank_in();