Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package schismtracker for openSUSE:Factory checked in at 2023-10-29 19:41:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/schismtracker (Old) and /work/SRC/openSUSE:Factory/.schismtracker.new.17445 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "schismtracker" Sun Oct 29 19:41:42 2023 rev:26 rq:1120939 version:20231029 Changes: -------- --- /work/SRC/openSUSE:Factory/schismtracker/schismtracker.changes 2023-09-07 21:15:12.646602617 +0200 +++ /work/SRC/openSUSE:Factory/.schismtracker.new.17445/schismtracker.changes 2023-10-29 19:42:09.972175028 +0100 @@ -1,0 +2,8 @@ +Sun Oct 29 04:31:24 UTC 2023 - Jan Engelhardt <jeng...@inai.de> + +- Update to release 2013102 + * Fixed many OpenMPT test cases, which can (and will) break some + older modules. + * Remove many old flags that were not considered very useful. + +------------------------------------------------------------------- Old: ---- 20230906.tar.gz New: ---- 20231029.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ schismtracker.spec ++++++ --- /var/tmp/diff_new_pack.F8XDPc/_old 2023-10-29 19:42:10.580197148 +0100 +++ /var/tmp/diff_new_pack.F8XDPc/_new 2023-10-29 19:42:10.584197293 +0100 @@ -17,7 +17,7 @@ Name: schismtracker -Version: 20230906 +Version: 20231029 Release: 0 Summary: Music editor that matches the look and feel of Impulse Tracker License: GPL-2.0-or-later ++++++ 20230906.tar.gz -> 20231029.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/.github/workflows/build.yml new/schismtracker-20231029/.github/workflows/build.yml --- old/schismtracker-20230906/.github/workflows/build.yml 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/.github/workflows/build.yml 2023-10-29 03:15:05.000000000 +0100 @@ -188,6 +188,7 @@ cp /usr/local/lib/libSDL2-2.0.0.dylib Resources cp /usr/local/lib/libFLAC.12.dylib Resources cp /usr/local/lib/libogg.0.dylib Resources + install_name_tool -change /usr/local/lib/libogg.0.dylib @loader_path/../Resources/libogg.0.dylib Resources/libFLAC.12.dylib cd MacOS install_name_tool -change /usr/local/lib/libSDL2-2.0.0.dylib @executable_path/../Resources/libSDL2-2.0.0.dylib schismtracker install_name_tool -change /usr/local/lib/libFLAC.12.dylib @executable_path/../Resources/libFLAC.12.dylib schismtracker diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/.gitignore new/schismtracker-20231029/.gitignore --- old/schismtracker-20230906/.gitignore 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/.gitignore 2023-10-29 03:15:05.000000000 +0100 @@ -1,8 +1,10 @@ *.swp *.o +.cache/ .deps/ .dirstamp .vs/ +.vscode/ /Makefile /Makefile.in /aclocal.m4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/configure.ac new/schismtracker-20231029/configure.ac --- old/schismtracker-20230906/configure.ac 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/configure.ac 2023-10-29 03:15:05.000000000 +0100 @@ -110,7 +110,7 @@ AC_MSG_RESULT(found) dnl frameworks aren't part of sdl... should be a separate variable - SDL_LIBS="$SDL_LIBS -lSDL2main -framework Cocoa -framework CoreAudio -framework CoreMIDI -framework IOKit -framework OpenGL" + SDL_LIBS="$SDL_LIBS -lSDL2main -framework Cocoa -framework CoreAudio -framework CoreMIDI -framework IOKit" AC_SUBST(SDL_LIBS) AM_CONDITIONAL([USE_MACOSX], true) @@ -168,12 +168,6 @@ fi fi -dnl OpenGL crud - it doesn't always exist -saved_cppflags=$CPPFLAGS -CPPFLAGS="$CPPFLAGS $SDL_CFLAGS" -AC_CHECK_HEADER([SDL_opengl.h], [AC_DEFINE([USE_OPENGL], 1, [Define to 1 if SDL's OpenGL works])]) -CPPFLAGS=$saved_cppflags - dnl ----------------------------------------------------------------------- saved_libs=$LIBS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/fmt/imf.c new/schismtracker-20231029/fmt/imf.c --- old/schismtracker-20230906/fmt/imf.c 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/fmt/imf.c 2023-10-29 03:15:05.000000000 +0100 @@ -117,7 +117,7 @@ uint8_t unused3[5]; uint16_t ems; /* Reserved for internal usage */ uint32_t dram; /* Reserved for internal usage */ - char is10[4]; /* 'IS10' */ + char is10[4]; /* 'IS10' or 'IW10' */ }; #pragma pack(pop) @@ -542,12 +542,6 @@ slurp_read(fp, &imfsmp, sizeof(imfsmp)); - if (memcmp(imfsmp.is10, "IS10", 4) != 0) { - //printf("is10 says %02x %02x %02x %02x!\n", - // imfsmp.is10[0], imfsmp.is10[1], imfsmp.is10[2], imfsmp.is10[3]); - return LOAD_FORMAT_ERROR; - } - strncpy(sample->filename, imfsmp.name, 12); sample->filename[12] = 0; strcpy(sample->name, sample->filename); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/fmt/pat.c new/schismtracker-20231029/fmt/pat.c --- old/schismtracker-20230906/fmt/pat.c 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/fmt/pat.c 2023-10-29 03:15:05.000000000 +0100 @@ -176,7 +176,7 @@ memcpy(&gfsamp, data + pos, sizeof(gfsamp)); pos += sizeof(gfsamp); - n = instrument_loader_sample(&ii, i + 1) - 1; + n = instrument_loader_sample(&ii, i + 1); smp = song_get_sample(n); gfsamp.samplesize = bswapLE32(gfsamp.samplesize); @@ -232,8 +232,7 @@ smp->vib_rate = gfsamp.vib_rate; smp->vib_depth = gfsamp.vib_depth; - pos += csf_read_sample(current_song->samples + n, rs, data + pos, length - pos); + pos += csf_read_sample(smp, rs, data + pos, length - pos); } return 1; } - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/include/sndfile.h new/schismtracker-20231029/include/sndfile.h --- old/schismtracker-20230906/include/sndfile.h 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/include/sndfile.h 2023-10-29 03:15:05.000000000 +0100 @@ -413,6 +413,7 @@ // 2nd cache line uint32_t length; // only to the end of the loop uint32_t flags; + uint32_t old_flags; uint32_t loop_start; // loop or sustain, whichever is active uint32_t loop_end; int32_t right_ramp_volume; // ? @@ -566,6 +567,7 @@ uint32_t mix_stat; // number of channels being mixed (not really used) uint32_t buffer_count; // number of samples to mix per tick uint32_t tick_count; + uint32_t frame_delay; int32_t row_count; /* IMPORTANT needs to be signed */ uint32_t current_speed; uint32_t current_tempo; @@ -596,6 +598,8 @@ uint32_t mix_flags; // SNDMIX_* uint32_t mix_frequency, mix_bits_per_sample, mix_channels; + int patloop; // effects.c: need this for stupid pattern break compatibility + // noise reduction filter int32_t left_nr, right_nr; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/player/effects.c new/schismtracker-20231029/player/effects.c --- old/schismtracker-20230906/player/effects.c 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/player/effects.c 2023-10-29 03:15:05.000000000 +0100 @@ -90,12 +90,14 @@ song_voice_t *chan = &csf->voices[nchan]; // stop the current note: chan->flags |= CHN_FASTVOLRAMP; - chan->length = 0; + //if (chan->ptr_instrument) chan->volume = 0; + chan->increment = 0; if (clear_note) { // keep instrument numbers from picking up old notes // (SCx doesn't do this) chan->frequency = 0; } + if (chan->flags & CHN_ADLIB) { //Do this only if really an adlib chan. Important! OPL_NoteOff(nchan); @@ -382,11 +384,22 @@ pdelta = square_table[panpos]; break; case VIB_RANDOM: - pdelta = 128 * ((double) rand() / RAND_MAX) - 64; + pdelta = (rand() & 0x7F) - 0x40; break; } - chan->panbrello_position += chan->panbrello_speed; + /* OpenMPT test case RandomWaveform.it: + Speed for random panbrello says how many ticks the value should be used */ + if (chan->panbrello_type == VIB_RANDOM) { + if (!chan->panbrello_position || chan->panbrello_position >= chan->panbrello_speed) { + chan->panbrello_position = 0; + chan->panbrello_delta = pdelta; + } + chan->panbrello_position++; + pdelta = chan->panbrello_delta; + } else { + chan->panbrello_position += chan->panbrello_speed; + } pdelta = ((pdelta * (int)chan->panbrello_depth) + 2) >> 3; chan->panbrello_delta = pdelta; } @@ -620,6 +633,7 @@ // ... .. .. SB1 // it still doesn't work right in a few strange cases, but oh well :P chan->patloop_row = csf->row + 1; + csf->patloop = 0; return; // don't loop! } } else { @@ -627,6 +641,7 @@ } csf->process_row = chan->patloop_row - 1; } else { + csf->patloop = 1; chan->patloop_row = csf->row; } } @@ -655,12 +670,15 @@ break; // S5x: Set Panbrello WaveForm case 0x50: - chan->panbrello_type = param; + /* some mpt compat thing */ + chan->panbrello_type = (param < 0x04) ? param : 0; break; // S6x: Pattern Delay for x ticks case 0x60: - if (csf->flags & SONG_FIRSTTICK) + if (csf->flags & SONG_FIRSTTICK) { + csf->frame_delay += param; csf->tick_count += param; + } break; // S7x: Envelope Control case 0x70: @@ -735,7 +753,7 @@ if (csf->flags & SONG_FIRSTTICK) chan->cd_note_cut = param ?: 1; else if (--chan->cd_note_cut == 0) - fx_note_cut(csf, nchan, 0); + fx_note_cut(csf, nchan, 1); break; // SDx: Note Delay // SEx: Pattern Delay for x rows @@ -758,15 +776,15 @@ { song_voice_t *chan = &csf->voices[nchan]; - if (len >= 1 && (data[0] == 0xFA || data[0] == 0xFC || data[0] == 0xFF)) { + if (len == 1 && (data[0] == 0xFA || data[0] == 0xFC || data[0] == 0xFF)) { // Start Song, Stop Song, MIDI Reset for (uint32_t c = 0; c < MAX_VOICES; c++) { csf->voices[c].cutoff = 0x7F; - csf->voices[c].resonance = 0; + csf->voices[c].resonance = 0x00; } } - if (len >= 4 && data[0] == 0xF0 && data[1] == 0xF0) { + if (len == 4 && data[0] == 0xF0 && data[1] == 0xF0) { // impulse tracker filter control (mfg. 0xF0) switch (data[2]) { case 0x00: // set cutoff @@ -851,66 +869,94 @@ } for (int read_pos = 0; read_pos <= 32 && macro[read_pos]; read_pos++) { - int data, is_nibble = 0; - if (macro[read_pos] >= '0' && macro[read_pos] <= '9') { - data = macro[read_pos] - '0'; - is_nibble = 1; - } else if (macro[read_pos] >= 'A' && macro[read_pos] <= 'F') { - data = (macro[read_pos] - 'A') + 10; - is_nibble = 1; - } else if (macro[read_pos] == 'c') { - data = midi_channel; - is_nibble = 1; - saw_c = 1; - } else if (macro[read_pos] == 'n') { - data = (note-1); - } else if (macro[read_pos] == 'v') { - data = velocity; - } else if (macro[read_pos] == 'u') { - data = (chan->volume >> 1); - if (data > 127) data = 127; - } else if (macro[read_pos] == 'x') { - data = chan->panning; - if (data > 127) data = 127; - } else if (macro[read_pos] == 'y') { - data = chan->final_panning; - if (data > 127) data = 127; - } else if (macro[read_pos] == 'a') { - /* MIDI Bank (high byte) */ - if (!penv || penv->midi_bank == -1) - data = 0; - else - data = (penv->midi_bank >> 7) & 127; - } else if (macro[read_pos] == 'b') { - /* MIDI Bank (low byte) */ - if (!penv || penv->midi_bank == -1) - data = 0; - else - data = penv->midi_bank & 127; - } else if (macro[read_pos] == 'p') { - /* MIDI Program */ - if (!penv || penv->midi_program == -1) - data = 0; - else - data = penv->midi_program & 127; - } else if (macro[read_pos] == 'z') { - /* Zxx Param */ - data = param & 0x7F; - } else if (macro[read_pos] == 'h') { - /* Host channel */ - data = nchan & 0x7F; - } else if (macro[read_pos] == 'm') { - /* Loop direction (judging from the macro letter, this was supposed to be - loop mode instead, but a wrong offset into the channel structure was used in IT.) */ - data = (chan->flags & CHN_PINGPONGFLAG) ? 1 : 0; - } else if (macro[read_pos] == 'o') { - /* Sample offset */ - data = (chan->mem_offset >> 8) & 0x7F; - } else { - continue; + unsigned char data = 0; + int is_nibble = 0; + switch (macro[read_pos]) { + case '0': case '1': case '2': + case '3': case '4': case '5': + case '6': case '7': case '8': + case '9': + data = (unsigned char)(macro[read_pos] - '0'); + is_nibble = 1; + break; + case 'A': case 'B': case 'C': + case 'D': case 'E': case 'F': + data = (unsigned char)((macro[read_pos] - 'A') + 0x0A); + is_nibble = 1; + break; + case 'c': + /* Channel */ + data = (unsigned char)midi_channel; + is_nibble = 1; + saw_c = 1; + break; + case 'n': + /* Note */ + if (NOTE_IS_NOTE(chan->note)) + data = (unsigned char)(chan->note - 1); + break; + case 'v': { + /* Velocity (Global Volume) + 8bitbubsy's it2play loosely used as a reference */ + if (!(chan->flags & CHN_MUTE) && chan->ptr_sample) { + uint32_t vol = _muldiv(chan->volume * csf->current_global_volume * chan->global_volume, chan->ptr_sample->global_volume * 2, 1 << 19); + data = (unsigned char)CLAMP(vol >> 2, 0x01, 0x7F); + } + break; + } + case 'u': { + /* Volume */ + if (!(chan->flags & CHN_MUTE)) + data = (unsigned char)CLAMP(chan->final_volume >> 7, 0x01, 0x7F); + break; + } + case 'x': + /* Panning */ + data = (unsigned char)MIN(chan->panning, 0x7F); + break; + case 'y': + /* Final Panning */ + data = (unsigned char)MIN(chan->final_panning, 0x7F); + break; + case 'a': + /* MIDI Bank (high byte) */ + if (penv && penv->midi_bank) + data = (unsigned char)((penv->midi_bank >> 7) & 0x7F); + break; + case 'b': + /* MIDI Bank (low byte) */ + if (penv && penv->midi_bank) + data = (unsigned char)(penv->midi_bank & 0x7F); + break; + case 'p': + /* MIDI Program */ + if (penv && penv->midi_program) + data = (unsigned char)(penv->midi_program & 0x7F); + break; + case 'z': + /* Zxx Param */ + data = (unsigned char)(param); + break; + case 'h': + /* Host channel */ + data = (unsigned char)(nchan & 0x7F); + break; + case 'm': + /* Loop direction (judging from the macro letter, this was supposed to be + loop mode instead, but a wrong offset into the channel structure was used in IT.) */ + data = (chan->flags & CHN_PINGPONGFLAG) ? 1 : 0; + break; + case 'o': + /* OpenMPT test case ZxxSecrets.it: + offsets are NOT clamped! also SAx doesn't count :) */ + data = (unsigned char)((chan->mem_offset >> 8) & 0xFF); + break; + default: + continue; } + if (is_nibble == 1) { - if(nibble_pos == 0) { + if (nibble_pos == 0) { outbuffer[write_pos] = data; nibble_pos = 1; } else { @@ -919,7 +965,7 @@ nibble_pos = 0; } } else { - if(nibble_pos == 1) { + if (nibble_pos == 1) { write_pos++; nibble_pos = 0; } @@ -939,12 +985,10 @@ uint32_t send_length = 0; if (outbuffer[send_pos] == 0xF0) { // SysEx start - if ((write_pos - send_pos >= 4) && outbuffer[send_pos + 1] == 0xF0) - { + if ((write_pos - send_pos >= 4) && outbuffer[send_pos + 1] == 0xF0) { // Internal macro, 4 bytes long send_length = 4; - } else - { + } else { // SysEx message, find end of message for (uint32_t i = send_pos + 1; i < write_pos; i++) { if (outbuffer[i] == 0xF7) { @@ -959,10 +1003,9 @@ send_length = write_pos - send_pos; } } - } else if (!(outbuffer[send_pos] & 0x80)) - { + } else if (!(outbuffer[send_pos] & 0x80)) { // Missing status byte? Try inserting running status - if (running_status != 0) { + if (running_status) { send_pos--; outbuffer[send_pos] = running_status; } else { @@ -976,9 +1019,8 @@ send_length = MIN(midi_event_length(outbuffer[send_pos]), write_pos - send_pos); } - if (send_length == 0) { + if (send_length == 0) break; - } if (outbuffer[send_pos] < 0xF0) { running_status = outbuffer[send_pos]; @@ -1163,7 +1205,6 @@ } // this was migrated from csf_note_change, should it be here? - chan->flags &= ~CHN_NOTEFADE; chan->fadeout_volume = 65536; } @@ -1173,28 +1214,39 @@ if (instr >= MAX_INSTRUMENTS) return; song_instrument_t *penv = (csf->flags & SONG_INSTRUMENTMODE) ? csf->instruments[instr] : NULL; - song_sample_t *psmp = chan->ptr_sample; + song_sample_t *psmp = &csf->samples[instr]; const song_sample_t *oldsmp = chan->ptr_sample; + const int old_instrument_volume = chan->instrument_volume; uint32_t note = chan->new_note; - if (note == NOTE_NONE) { + if (note == NOTE_NONE) return; - } else if (NOTE_IS_CONTROL(note)) { - /* nothing here either */ - } else if (penv) { - if (NOTE_IS_CONTROL(penv->note_map[note-1])) + + if (penv && NOTE_IS_NOTE(note)) { + /* OpenMPT test case emptyslot.it */ + if (penv->sample_map[note - 1] == 0) { + chan->ptr_instrument = penv; return; - if (!penv->sample_map[note - 1]) + } + + if (penv->note_map[note - 1] > NOTE_LAST) return; + uint32_t n = penv->sample_map[note - 1]; + psmp = csf_translate_keyboard(csf, penv, note, NULL); + } else if (csf->flags & SONG_INSTRUMENTMODE) { + if (!NOTE_IS_CONTROL(note)) return; - if (!(porta && (csf->flags & SONG_COMPATGXX) && penv == chan->ptr_instrument && chan->ptr_sample && chan->current_sample_data)) - psmp = csf_translate_keyboard(csf, penv, note, NULL); - chan->flags &= ~CHN_SUSTAINLOOP; // turn off sustain - } else { - psmp = csf->samples + instr; + if (!penv) { + /* OpenMPT test case emptyslot.it */ + chan->ptr_instrument = NULL; + chan->new_instrument = 0; + return; + } + psmp = NULL; } // Update Volume if (inst_column && psmp) chan->volume = psmp->volume; + // inst_changed is used for IT carry-on env option if (penv != chan->ptr_instrument || !chan->current_sample_data) { inst_changed = 1; @@ -1203,20 +1255,25 @@ // Instrument adjust chan->new_instrument = 0; + if (psmp) { psmp->played = 1; if (penv) { penv->played = 1; chan->instrument_volume = (psmp->global_volume * penv->global_volume) >> 7; - chan->nna = penv->nna; } else { chan->instrument_volume = psmp->global_volume; } } - if (penv && !inst_changed && psmp != oldsmp && chan->current_sample_data && !NOTE_IS_NOTE(note)) { + /* OpenMPT test case InstrAfterMultisamplePorta.it: + C#5 01 ... <- maps to sample 1 + C-5 .. G02 <- maps to sample 2 + ... 01 ... <- plays sample 1 with the volume and panning attributes of sample 2 + */ + if (penv && !inst_changed && psmp != oldsmp && chan->ptr_sample && !NOTE_IS_NOTE(chan->row_note)) return; - } + if (!penv && psmp != oldsmp && porta) { chan->flags |= CHN_NEWNOTE; } @@ -1246,6 +1303,7 @@ env_reset(chan, inst_changed || (chan->flags & CHN_KEYOFF)); } else if (!(penv->flags & ENV_VOLUME)) { // XXX why is this being done? + // I'm pretty sure this is just some stupid IT thing with portamentos chan->vol_env_position = 0; } @@ -1272,20 +1330,15 @@ chan->instrument_volume = 0; return; } + if (psmp == chan->ptr_sample && chan->current_sample_data && chan->length) return; - // sample change: reset sample vibrato - chan->autovib_depth = 0; - chan->autovib_position = 0; + if (porta && !chan->length) + chan->increment = 0; - if ((chan->flags & (CHN_KEYOFF | CHN_NOTEFADE)) && inst_column) { - // Don't start new notes after ===/~~~ - chan->frequency = 0; - } chan->flags &= ~(CHN_SAMPLE_FLAGS | CHN_KEYOFF | CHN_NOTEFADE | CHN_VOLENV | CHN_PANENV | CHN_PITCHENV); - chan->flags |= psmp->flags & CHN_SAMPLE_FLAGS; if (penv) { if (penv->flags & ENV_VOLUME) chan->flags |= CHN_VOLENV; @@ -1293,14 +1346,33 @@ chan->flags |= CHN_PANENV; if (penv->flags & ENV_PITCH) chan->flags |= CHN_PITCHENV; - if ((penv->flags & ENV_PITCH) && (penv->flags & ENV_FILTER) && !chan->cutoff) - chan->cutoff = 0x7F; if (penv->ifc & 0x80) chan->cutoff = penv->ifc & 0x7F; if (penv->ifr & 0x80) chan->resonance = penv->ifr & 0x7F; } + if (chan->row_note == NOTE_OFF && (csf->flags & SONG_ITOLDEFFECTS) && psmp != oldsmp) { + if (chan->ptr_sample) + chan->flags |= chan->ptr_sample->flags & CHN_SAMPLE_FLAGS; + if (psmp->flags & CHN_PANNING) + chan->panning = psmp->panning; + chan->instrument_volume = old_instrument_volume; + chan->volume = psmp->volume; + chan->position = 0; + return; + } + + // sample change: reset sample vibrato + chan->autovib_depth = 0; + chan->autovib_position = 0; + + if ((chan->flags & (CHN_KEYOFF | CHN_NOTEFADE)) && inst_column) { + // Don't start new notes after ===/~~~ + chan->frequency = 0; + } + chan->flags |= psmp->flags & CHN_SAMPLE_FLAGS; + chan->ptr_sample = psmp; chan->length = psmp->length; chan->loop_start = psmp->loop_start; @@ -1344,7 +1416,6 @@ if (!(have_inst && porta && pins)) pins = csf_translate_keyboard(csf, penv, note, pins); note = penv->note_map[note - 1]; - chan->flags &= ~CHN_SUSTAINLOOP; // turn off sustain } if (NOTE_IS_CONTROL(note)) { @@ -1354,13 +1425,16 @@ switch (note) { case NOTE_OFF: fx_key_off(csf, nchan); + if (!porta && (csf->flags & SONG_ITOLDEFFECTS) && chan->row_instr) + chan->flags &= ~(CHN_NOTEFADE | CHN_KEYOFF); break; case NOTE_CUT: fx_note_cut(csf, nchan, 1); break; case NOTE_FADE: default: // Impulse Tracker handles all unknown notes as fade internally - chan->flags |= CHN_NOTEFADE; + if (csf->flags & SONG_INSTRUMENTMODE) + chan->flags |= CHN_NOTEFADE; break; } return; @@ -1372,6 +1446,9 @@ if(!porta && pins) chan->c5speed = pins->c5speed; + if (porta && !chan->increment) + porta = 0; + note = CLAMP(note, NOTE_FIRST, NOTE_LAST); chan->note = CLAMP(truenote, NOTE_FIRST, NOTE_LAST); chan->new_instrument = 0; @@ -1428,10 +1505,15 @@ chan->panning = CLAMP(chan->panning + delta, 0, 256); } - if (!porta) + if (!porta) { + if (penv) chan->nna = penv->nna; env_reset(chan, 0); + } + + /* OpenMPT test cases Off-Porta.it, Off-Porta-CompatGxx.it */ + if (porta && (csf->flags & SONG_COMPATGXX && chan->row_instr)) + chan->flags &= ~CHN_KEYOFF; - chan->flags &= ~CHN_KEYOFF; // Enable Ramping if (!porta) { chan->vu_meter = 0x0; @@ -1543,43 +1625,41 @@ } if (instr >= MAX_INSTRUMENTS) instr = 0; data = chan->current_sample_data; - ptr_instrument = chan->ptr_instrument; - if (instr && note) { - ptr_instrument = (csf->flags & SONG_INSTRUMENTMODE) ? csf->instruments[instr] : NULL; - if (ptr_instrument) { - uint32_t n = 0; - if (!NOTE_IS_CONTROL(note)) { - n = ptr_instrument->sample_map[note-1]; - note = ptr_instrument->note_map[note-1]; - if (n && n < MAX_SAMPLES) - data = csf->samples[n].data; - } - } else { - data = NULL; - } + /* OpenMPT test case DNA-NoInstr.it */ + ptr_instrument = instr > 0 ? csf->instruments[instr] : chan->ptr_instrument; + int dna_note = note; + if (ptr_instrument != NULL) { + uint32_t n = ptr_instrument->sample_map[note - 1]; + /* MPT test case dct_smp_note_test.it */ + dna_note = ptr_instrument->note_map[note - 1]; + if (n > 0 && n < MAX_SAMPLES) + data = csf->samples[n].data; + else /* OpenMPT test case emptyslot.it */ + return; } if (!penv) return; p = chan; for (uint32_t i=nchan; i<MAX_VOICES; p++, i++) { if (!((i >= MAX_CHANNELS || p == chan) - && ((p->master_channel == nchan+1 || p == chan) + && ((p->master_channel == nchan + 1 || p == chan) && p->ptr_instrument))) continue; - int ok = 0; + int apply_dna = 0; // Duplicate Check Type switch (p->ptr_instrument->dct) { case DCT_NOTE: - ok = (NOTE_IS_NOTE(note) && (int) p->note == note && ptr_instrument == p->ptr_instrument); + apply_dna = (NOTE_IS_NOTE(note) && (int) p->note == note && ptr_instrument == p->ptr_instrument); break; case DCT_SAMPLE: - ok = (data && data == p->current_sample_data); + apply_dna = (data && data == p->current_sample_data && ptr_instrument == p->ptr_instrument); break; case DCT_INSTRUMENT: - ok = (ptr_instrument == p->ptr_instrument); + apply_dna = (ptr_instrument == p->ptr_instrument); break; } + // Duplicate Note Action - if (ok) { + if (apply_dna) { switch(p->ptr_instrument->dca) { case DCA_NOTECUT: fx_note_cut(csf, i, 1); @@ -1790,7 +1870,7 @@ break; case FX_GLOBALVOLUME: - if (!(csf->flags & SONG_FIRSTTICK)) + if (!firsttick) break; if (param <= 128) csf->current_global_volume = param; @@ -1875,7 +1955,7 @@ break; case FX_PATTERNBREAK: - if (csf->flags & SONG_FIRSTTICK) { + if (csf->flags & SONG_FIRSTTICK && !csf->patloop) { csf->break_row = param; csf->process_row = PROCESS_NEXT_ORDER; } @@ -1891,7 +1971,7 @@ } else { csf_process_midi_macro(csf, nchan, csf->midi_config.zxx[param & 0x7F], - 0, 0, 0, 0); + param, 0, 0, 0); } break; @@ -1944,7 +2024,7 @@ break; case VOLFX_PORTAUP: // Fx - if (firsttick) { + if (start_note) { if (vol) chan->mem_pitchslide = 4 * vol; if (!(csf->flags & SONG_COMPATGXX)) @@ -1955,7 +2035,7 @@ break; case VOLFX_PORTADOWN: // Ex - if (firsttick) { + if (start_note) { if (vol) chan->mem_pitchslide = 4 * vol; if (!(csf->flags & SONG_COMPATGXX)) @@ -1966,18 +2046,18 @@ break; case VOLFX_TONEPORTAMENTO: // Gx - if (firsttick) { + if (start_note) { if (vol) chan->mem_portanote = vc_portamento_table[vol & 0x0F]; if (!(csf->flags & SONG_COMPATGXX)) chan->mem_pitchslide = chan->mem_portanote; + } else { + fx_tone_portamento(csf->flags, chan, vc_portamento_table[vol & 0x0F]); } - fx_tone_portamento(csf->flags | (firsttick ? SONG_FIRSTTICK : 0), chan, - vc_portamento_table[vol & 0x0F]); break; case VOLFX_VOLSLIDEUP: // Cx - if (firsttick) { + if (start_note) { if (vol) chan->mem_vc_volslide = vol; } else { @@ -1986,7 +2066,7 @@ break; case VOLFX_VOLSLIDEDOWN: // Dx - if (firsttick) { + if (start_note) { if (vol) chan->mem_vc_volslide = vol; } else { @@ -1995,7 +2075,7 @@ break; case VOLFX_FINEVOLUP: // Ax - if (firsttick) { + if (start_note) { if (vol) chan->mem_vc_volslide = vol; else @@ -2005,7 +2085,7 @@ break; case VOLFX_FINEVOLDOWN: // Bx - if (firsttick) { + if (start_note) { if (vol) chan->mem_vc_volslide = vol; else @@ -2087,6 +2167,21 @@ // Handles note/instrument/volume changes if (start_note) { uint32_t note = chan->row_note; + /* MPT test case InstrumentNumberChange.it */ + if (csf->flags & SONG_INSTRUMENTMODE && (NOTE_IS_NOTE(note) || note == NOTE_NONE)) { + int instrcheck = instr ? instr : chan->last_instrument; + if (instrcheck && (instrcheck < 0 || instrcheck > MAX_INSTRUMENTS || csf->instruments[instrcheck] == NULL)) { + note = NOTE_NONE; + instr = 0; + } + } + if (csf->flags & SONG_INSTRUMENTMODE && instr && !NOTE_IS_NOTE(note)) { + if ((porta && csf->flags & SONG_COMPATGXX) + || (!porta && csf->flags & SONG_ITOLDEFFECTS)) { + env_reset(chan, 1); + chan->fadeout_volume = 65536; + } + } if (instr && note == NOTE_NONE) { if (csf->flags & SONG_INSTRUMENTMODE) { if (chan->ptr_sample) @@ -2097,18 +2192,29 @@ } if (csf->flags & SONG_INSTRUMENTMODE) { - if (instr < MAX_INSTRUMENTS && (chan->ptr_instrument != csf->instruments[instr] || !chan->increment)) + if (instr < MAX_INSTRUMENTS && (chan->ptr_instrument != csf->instruments[instr] || !chan->current_sample_data)) note = chan->note; } else { - if (instr < MAX_SAMPLES && (chan->ptr_sample != &csf->samples[instr] || !chan->increment)) + if (instr < MAX_SAMPLES && (chan->ptr_sample != &csf->samples[instr] || !chan->current_sample_data)) note = chan->note; } } // Invalid Instrument ? - if (instr >= MAX_INSTRUMENTS) instr = 0; - // Note Cut/Off => ignore instrument - if ((NOTE_IS_CONTROL(note)) || (note != NOTE_NONE && !porta)) { + if (instr >= MAX_INSTRUMENTS) + instr = 0; + + // Note Cut/Off/Fade => ignore instrument + if (NOTE_IS_CONTROL(note)) { + if (instr) { + const int smp = instr; + if (smp > 0 && smp < MAX_SAMPLES && csf->samples[smp].volume) + chan->volume = csf->samples[smp].volume; + } + if (!(csf->flags & SONG_ITOLDEFFECTS)) + instr = 0; + } + if (NOTE_IS_CONTROL(note) || (note != NOTE_NONE && !porta)) { /* This is required when the instrument changes (KeyOff is not called) */ /* Possibly a better bugfix could be devised. --Bisqwit */ if (chan->flags & CHN_ADLIB) { @@ -2120,9 +2226,7 @@ GM_Touch(nchan, 0); } - if (NOTE_IS_CONTROL(note)) { - instr = 0; - } else if (NOTE_IS_NOTE(note)) { + if (NOTE_IS_NOTE(note)) { chan->new_note = note; if (chan->channel_panning > 0) { @@ -2132,13 +2236,17 @@ chan->channel_panning = 0; } - // New Note Action ? (not when paused!!!) - if (!porta) + /* New Note Action + OpenMPT test case NoteOffInstr.it + is this correct? */ + if (!porta || !chan->increment) csf_check_nna(csf, nchan, instr, note, 0); } // Instrument Change ? if (instr) { - song_sample_t *psmp = chan->ptr_sample; + const song_sample_t *psmp = chan->ptr_sample; + const song_instrument_t *penv = chan->ptr_instrument; + csf_instrument_change(csf, chan, instr, porta, 1); if (csf->samples[instr].flags & CHN_ADLIB) { OPL_Patch(nchan, csf->samples[instr].adlib_bytes); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/player/sndmix.c new/schismtracker-20231029/player/sndmix.c --- old/schismtracker-20230906/player/sndmix.c 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/player/sndmix.c 2023-10-29 03:15:05.000000000 +0100 @@ -166,7 +166,7 @@ static inline int rn_sample_vibrato(song_t *csf, song_voice_t *chan, int frequency) { unsigned int vibpos = chan->autovib_position & 0xFF; - int vdelta, adepth; + int vdelta, adepth = 1; song_sample_t *pins = chan->ptr_sample; /* @@ -177,15 +177,19 @@ 5) Mov [SomeVariableNameRelatingToVibrato], AX ; For the next cycle. */ - adepth = chan->autovib_depth; // (1) - adepth += pins->vib_rate & 0xff; // (2 & 3) - /* need this cast -- if adepth is unsigned, large autovib will crash the mixer (why? I don't know!) - but if vib_depth is changed to signed, that screws up other parts of the code. ugh. */ - adepth = MIN(adepth, (int) (pins->vib_depth << 8)); - chan->autovib_depth = adepth; // (5) - adepth >>= 8; // (4) + /* OpenMPT test case VibratoSweep0.it: + don't calculate autovibrato if the speed is 0 */ + if (pins->vib_speed) { + adepth = chan->autovib_depth; // (1) + adepth += pins->vib_rate & 0xff; // (2 & 3) + /* need this cast -- if adepth is unsigned, large autovib will crash the mixer (why? I don't know!) + but if vib_depth is changed to signed, that screws up other parts of the code. ugh. */ + adepth = MIN(adepth, (int) (pins->vib_depth << 8)); + chan->autovib_depth = adepth; // (5) + adepth >>= 8; // (4) - chan->autovib_position += pins->vib_speed; + chan->autovib_position += pins->vib_speed; + } switch(pins->vib_type) { case VIB_SINE: @@ -358,24 +362,23 @@ static inline int rn_arpeggio(song_t *csf, song_voice_t *chan, int frequency) { - int a; + int a = 0; - switch ((csf->current_speed - csf->tick_count) % 3) { + const uint32_t real_tick_count = (csf->current_speed + csf->frame_delay) - csf->tick_count; + const uint32_t tick = real_tick_count % (csf->current_speed + csf->frame_delay); + switch (tick % 3) { case 1: a = chan->mem_arpeggio >> 4; break; case 2: a = chan->mem_arpeggio & 0xf; break; - default: - a = 0; } if (!a) return frequency; - a = linear_slide_up_table[a * 16]; - return _muldiv(frequency, a, 65536); + return _muldiv(frequency, linear_slide_up_table[a * 16], 65536); } @@ -452,7 +455,8 @@ return; } - if ((penv->flags & sus_flag) && !(chan->flags & CHN_KEYOFF)) { + /* OpenMPT test case EnvOffLength.it */ + if ((penv->flags & sus_flag) && !(chan->old_flags & CHN_KEYOFF)) { start = envelope->ticks[envelope->sustain_start]; end = envelope->ticks[envelope->sustain_end] + 1; fade_flag = 0; @@ -971,7 +975,7 @@ /* [-- Yes --] */ /* [Tick counter = Tick counter set (the current 'speed')] */ - csf->tick_count = csf->current_speed; + csf->tick_count = csf->current_speed + csf->frame_delay; /* [Decrease row counter. Is row counter 0?] */ if (--csf->row_count <= 0) { @@ -997,13 +1001,14 @@ /* [Update Pattern Variables] (this is handled along with update effects) */ + csf->frame_delay = 0; + csf->tick_count = csf->current_speed; csf->flags |= SONG_FIRSTTICK; } else { /* [-- No --] */ /* Call update-effects for each channel. */ } - // Reset channel values song_voice_t *chan = csf->voices; song_note_t *m = csf->patterns[csf->current_pattern] + csf->row * MAX_CHANNELS; @@ -1047,6 +1052,10 @@ } } + if (!(csf->tick_count % (csf->current_speed + csf->frame_delay))) { + csf->flags |= SONG_FIRSTTICK; + } + csf_process_effects(csf, 0); } @@ -1074,7 +1083,6 @@ csf->tick_count = csf->current_speed; if (--csf->row_count <= 0) { csf->row_count = 0; - //csf->flags |= SONG_FIRSTTICK; } // clear channel values (similar to csf_process_tick) for (cn = 0, chan = csf->voices; cn < MAX_CHANNELS; cn++, chan++) { @@ -1200,8 +1208,14 @@ rn_pitch_filter_envelope(csf, chan, &envpitch, &frequency); // Vibrato - if (chan->flags & CHN_VIBRATO) + if (chan->flags & CHN_VIBRATO) { + /* OpenMPT test case VibratoDouble.it: + vibrato is applied twice if vibrato is applied in the volume and effect columns */ + if (chan->row_voleffect == VOLFX_VIBRATODEPTH + && (chan->row_effect == FX_VIBRATO || chan->row_effect == FX_VIBRATOVOL || chan->row_effect == FX_FINEVIBRATO)) + frequency = rn_vibrato(csf, chan, frequency); frequency = rn_vibrato(csf, chan, frequency); + } // Sample Auto-Vibrato if (chan->ptr_sample && chan->ptr_sample->vib_depth) { @@ -1268,6 +1282,7 @@ chan->length = 0; } + chan->old_flags = chan->flags; chan->flags &= ~CHN_NEWNOTE; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/schism/audio_loadsave.c new/schismtracker-20231029/schism/audio_loadsave.c --- old/schismtracker-20230906/schism/audio_loadsave.c 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/schism/audio_loadsave.c 2023-10-29 03:15:05.000000000 +0100 @@ -1394,14 +1394,52 @@ csf_free(library); const char *base = get_basename(path); - library = song_create_load(path); - if (!library) { - /* FIXME: try loading as an instrument before giving up */ - log_appendf(4, "%s: %s", base, fmt_strerror(errno)); - errno = ENOTDIR; + + slurp_t* s = slurp(path, NULL, 0); + if (!s) { + log_perror(path); return -1; } + dmoz_file_t info_file = {0}; + info_file.path = str_dup(path); + info_file.filesize = s->length; + dmoz_fill_ext_data(&info_file); + + unslurp(s); + + /* free extra data we don't need */ + if (info_file.smp_filename != info_file.base && + info_file.smp_filename != info_file.title) { + free(info_file.smp_filename); + } + + free(info_file.path); + free(info_file.base); + + if (info_file.type & TYPE_EXT_DATA_MASK) { + if (info_file.artist) + free(info_file.artist); + free(info_file.title); + } + + if (info_file.type & TYPE_MODULE_MASK) { + library = song_create_load(path); + } else if (info_file.type & TYPE_INST_MASK) { + /* temporarily set the current song to the library */ + song_t* tmp_ptr = current_song; + library = current_song = csf_allocate(); + + int ret = song_load_instrument(1, path); + current_song = tmp_ptr; + if (!ret) { + log_appendf(4, "song_load_instrument: %s failed with %d", path, ret); + return 1; + } + } else { + return 0; + } + for (int n = 1; n < MAX_SAMPLES; n++) { if (library->samples[n].length) { for (int c = 0; c < 25; c++) { @@ -1411,7 +1449,8 @@ } dmoz_file_t *file = dmoz_add_file(flist, str_dup(path), str_dup(base), NULL, n); file->type = TYPE_SAMPLE_EXTD; - file->description = "Fishcakes"; // FIXME - what does IT say? + file->description = "Impulse Tracker Sample"; /* FIXME: this lies for XI and PAT */ + file->filesize = library->samples[n].length*((library->samples[n].flags & CHN_STEREO) + 1)*((library->samples[n].flags & CHN_16BIT) + 1); file->smp_speed = library->samples[n].c5speed; file->smp_loop_start = library->samples[n].loop_start; file->smp_loop_end = library->samples[n].loop_end; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/schism/main.c new/schismtracker-20231029/schism/main.c --- old/schismtracker-20230906/schism/main.c 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/schism/main.c 2023-10-29 03:15:05.000000000 +0100 @@ -290,26 +290,12 @@ {"audio-driver", 1, NULL, O_SDL_AUDIODRIVER}, {"video-driver", 1, NULL, O_SDL_VIDEODRIVER}, - {"video-yuvlayout", 1, NULL, O_VIDEO_YUVLAYOUT}, - {"video-size", 1, NULL, O_VIDEO_RESOLUTION}, - {"video-stretch", 0, NULL, O_VIDEO_STRETCH}, - {"no-video-stretch", 0, NULL, O_NO_VIDEO_STRETCH}, -#if USE_OPENGL - {"video-gl-path", 1, NULL, O_VIDEO_GLPATH}, -#endif - {"video-depth", 1, NULL, O_VIDEO_DEPTH}, -#if HAVE_SYS_KD_H - {"video-fb-device", 1, NULL, O_VIDEO_FBDEV}, -#endif #if USE_NETWORK {"network", 0, NULL, O_NETWORK}, {"no-network", 0, NULL, O_NO_NETWORK}, #endif {"classic", 0, NULL, O_CLASSIC_MODE}, {"no-classic", 0, NULL, O_NO_CLASSIC_MODE}, -#ifdef USE_X11 - {"display", 1, NULL, O_DISPLAY}, -#endif {"fullscreen", 0, NULL, O_FULLSCREEN}, {"no-fullscreen", 0, NULL, O_NO_FULLSCREEN}, {"play", 0, NULL, O_PLAY}, @@ -321,7 +307,6 @@ {"hooks", 0, NULL, O_HOOKS}, {"no-hooks", 0, NULL, O_NO_HOOKS}, #endif - {"debug", 1, NULL, O_DEBUG}, {"version", 0, NULL, O_VERSION}, {"help", 0, NULL, O_HELP}, {NULL, 0, NULL, 0}, @@ -336,34 +321,7 @@ case O_SDL_VIDEODRIVER: video_driver = str_dup(optarg); break; - // FIXME remove all these env vars, and put these things into a global struct or something instead - - case O_VIDEO_YUVLAYOUT: - put_env_var("SCHISM_YUVLAYOUT", optarg); - break; - case O_VIDEO_RESOLUTION: - put_env_var("SCHISM_VIDEO_RESOLUTION", optarg); - break; - case O_VIDEO_STRETCH: - put_env_var("SCHISM_VIDEO_ASPECT", "full"); - break; - case O_NO_VIDEO_STRETCH: - put_env_var("SCHISM_VIDEO_ASPECT", "fixed"); - break; -#if USE_OPENGL - case O_VIDEO_GLPATH: - put_env_var("SDL_VIDEO_GL_DRIVER", optarg); - break; -#endif - case O_VIDEO_DEPTH: - put_env_var("SCHISM_VIDEO_DEPTH", optarg); - break; -#if HAVE_SYS_KD_H - case O_VIDEO_FBDEV: - put_env_var("SDL_FBDEV", optarg); - break; -#endif #if USE_NETWORK case O_NETWORK: startup_flags |= SF_NETWORK; @@ -380,15 +338,6 @@ startup_flags &= ~SF_CLASSIC; did_classic = 1; break; - - case O_DEBUG: - put_env_var("SCHISM_DEBUG", optarg); - break; -#ifdef USE_X11 - case O_DISPLAY: - put_env_var("DISPLAY", optarg); - break; -#endif case O_FULLSCREEN: video_fullscreen(1); did_fullscreen = 1; @@ -430,19 +379,6 @@ printf( " -a, --audio-driver=DRIVER\n" " -v, --video-driver=DRIVER\n" - " --video-yuvlayout=LAYOUT\n" - " --video-size=WIDTHxHEIGHT\n" - " --video-stretch (--no-video-stretch)\n" -#if USE_OPENGL - " --video-gl-path=/path/to/opengl.so\n" -#endif - " --video-depth=DEPTH\n" -#if HAVE_SYS_KD_H - " --video-fb-device=/dev/fb0\n" -#endif -#if USE_NETWORK - " --network (--no-network)\n" -#endif " --classic (--no-classic)\n" #ifdef USE_X11 " --display=DISPLAYNAME\n" @@ -454,7 +390,6 @@ #if ENABLE_HOOKS " --hooks (--no-hooks)\n" #endif - //" --debug=OPS\n" " --version\n" " -h, --help\n" ); @@ -609,14 +544,11 @@ int wheel_x; int wheel_y; int sawrep; - char *debug_s; int fix_numlock_key; struct key_event kk; fix_numlock_key = status.fix_numlock_setting; - debug_s = getenv("SCHISM_DEBUG"); - downtrip = 0; last_mouse_down = 0; startdown = 0; @@ -733,21 +665,7 @@ kk.mod = modkey; kk.mouse = MOUSE_NONE; - if (debug_s && strstr(debug_s, "key")) { - log_appendf(12, "[DEBUG] Key%s sym=%d scancode=%d", - (event.type == SDL_KEYDOWN) ? "Down" : "Up", - (int)event.key.keysym.sym, - (int)event.key.keysym.scancode); - } key_translate(&kk); - if (debug_s && strstr(debug_s, "translate") - && kk.orig_sym.sym != kk.sym.sym) { - log_appendf(12, "[DEBUG] Translate Key%s sym=%d scancode=%d -> %d (%c)", - (event.type == SDL_KEYDOWN) ? "Down" : "Up", - (int)event.key.keysym.sym, - (int)event.key.keysym.scancode, - kk.sym.sym, kk.unicode); - } if (event.type == SDL_KEYDOWN && last_key.sym == kk.sym.sym) { sawrep = kk.is_repeat = 1; } else { @@ -816,13 +734,6 @@ kk.sy = kk.y; } if (startdown) startdown = 0; - if (debug_s && strstr(debug_s, "mouse")) { - log_appendf(12, "[DEBUG] Mouse%s button=%d x=%d y=%d", - (event.type == SDL_MOUSEBUTTONDOWN) ? "Down" : "Up", - (int)event.button.button, - (int)event.button.x, - (int)event.button.y); - } switch (event.button.button) { case SDL_BUTTON_RIGHT: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/schism/video.c new/schismtracker-20231029/schism/video.c --- old/schismtracker-20230906/schism/video.c 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/schism/video.c 2023-10-29 03:15:05.000000000 +0100 @@ -157,7 +157,7 @@ const char * video_driver_name(void) { - return "SDL2"; + return SDL_GetCurrentVideoDriver(); } void video_report(void) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/sys/macosx/macosx-sdlmain.m new/schismtracker-20231029/sys/macosx/macosx-sdlmain.m --- old/schismtracker-20230906/sys/macosx/macosx-sdlmain.m 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/sys/macosx/macosx-sdlmain.m 2023-10-29 03:15:05.000000000 +0100 @@ -166,36 +166,36 @@ /* Add menu items */ [appleMenu addItemWithTitle:@"About Schism Tracker" - action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; + action:@selector(orderFrontStandardAboutPanel:) keyEquivalent: @""]; [appleMenu addItem:[NSMenuItem separatorItem]]; /* other schism items */ menuItem = (NSMenuItem*)[appleMenu addItemWithTitle:@"Help" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(1)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"help"]; [appleMenu addItem:[NSMenuItem separatorItem]]; menuItem = (NSMenuItem*)[appleMenu addItemWithTitle:@"View Patterns" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(2)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"pattern"]; menuItem = (NSMenuItem*)[appleMenu addItemWithTitle:@"Orders/Panning" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(11)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"orders"]; menuItem = (NSMenuItem*)[appleMenu addItemWithTitle:@"Variables" action:@selector(_menu_callback:) - keyEquivalent:[NSString stringWithFormat:@"%C", NSF12FunctionKey]]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"variables"]; menuItem = (NSMenuItem*)[appleMenu addItemWithTitle:@"Message Editor" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(9)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [menuItem setRepresentedObject: @"message_edit"]; @@ -206,14 +206,14 @@ menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"]; [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)]; - [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; + [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent: @""]; [appleMenu addItem:[NSMenuItem separatorItem]]; [appleMenu addItemWithTitle:@"Quit Schism Tracker" action:@selector(terminate:) keyEquivalent:@"q"]; /* Put menu into the menubar */ - menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent: @""]; [menuItem setSubmenu:appleMenu]; [[NSApp mainMenu] addItem:menuItem]; @@ -221,35 +221,35 @@ otherMenu = [[NSMenu alloc] initWithTitle:@"File"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"New..." action:@selector(_menu_callback:) - keyEquivalent:@"n"]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSControlKeyMask]; [menuItem setRepresentedObject: @"new"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Load..." action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(9)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"load"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Save Current" action:@selector(_menu_callback:) - keyEquivalent:@"s"]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSControlKeyMask]; [menuItem setRepresentedObject: @"save"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Save As..." action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(10)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"save_as"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Export..." action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(10)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [menuItem setRepresentedObject: @"export_song"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Message Log" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(11)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSFunctionKeyMask|NSControlKeyMask]; [menuItem setRepresentedObject: @"logviewer"]; - menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent: @""]; [menuItem setSubmenu:otherMenu]; [[NSApp mainMenu] addItem:menuItem]; @@ -257,40 +257,40 @@ otherMenu = [[NSMenu alloc] initWithTitle:@"Playback"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Show Infopage" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(5)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"info"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Play Song" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(5)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSControlKeyMask]; [menuItem setRepresentedObject: @"play"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Play Pattern" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(6)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"play_pattern"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Play from Order" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(6)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [menuItem setRepresentedObject: @"play_order"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Play from Mark/Cursor" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(7)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"play_mark"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Stop" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(8)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"stop"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Calculate Length" action:@selector(_menu_callback:) - keyEquivalent:@"p"]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:(NSFunctionKeyMask|NSControlKeyMask)]; [menuItem setRepresentedObject: @"calc_length"]; - menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent: @""]; [menuItem setSubmenu:otherMenu]; [[NSApp mainMenu] addItem:menuItem]; @@ -298,20 +298,20 @@ otherMenu = [[NSMenu alloc] initWithTitle:@"Samples"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Sample List" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(3)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"sample_page"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Sample Library" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(3)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [menuItem setRepresentedObject: @"sample_library"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Reload Soundcard" action:@selector(_menu_callback:) - keyEquivalent:@"g"]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSControlKeyMask]; [menuItem setRepresentedObject: @"init_sound"]; - menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent: @""]; [menuItem setSubmenu:otherMenu]; [[NSApp mainMenu] addItem:menuItem]; @@ -319,15 +319,15 @@ otherMenu = [[NSMenu alloc] initWithTitle:@"Instruments"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Instrument List" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(4)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:0]; [menuItem setRepresentedObject: @"inst_page"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Instrument Library" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(4)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [menuItem setRepresentedObject: @"inst_library"]; - menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent: @""]; [menuItem setSubmenu:otherMenu]; [[NSApp mainMenu] addItem:menuItem]; @@ -335,35 +335,35 @@ otherMenu = [[NSMenu alloc] initWithTitle:@"Settings"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Preferences" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(5)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [menuItem setRepresentedObject: @"preferences"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"MIDI Configuration" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(1)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSShiftKeyMask]; [menuItem setRepresentedObject: @"midi_config"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Palette Editor" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(12)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSControlKeyMask]; [menuItem setRepresentedObject: @"palette_page"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Font Editor" action:@selector(_menu_callback:) - keyEquivalent:@""]; + keyEquivalent: @""]; [menuItem setRepresentedObject: @"font_editor"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"System Configuration" action:@selector(_menu_callback:) - keyEquivalent:KEQ_FN(1)]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:NSControlKeyMask]; [menuItem setRepresentedObject: @"system_config"]; menuItem = (NSMenuItem*)[otherMenu addItemWithTitle:@"Toggle Fullscreen" action:@selector(_menu_callback:) - keyEquivalent:@"\r"]; + keyEquivalent: @""]; [menuItem setKeyEquivalentModifierMask:(NSControlKeyMask|NSAlternateKeyMask)]; [menuItem setRepresentedObject: @"fullscreen"]; - menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""]; + menuItem = (NSMenuItem*)[[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent: @""]; [menuItem setSubmenu:otherMenu]; [[NSApp mainMenu] addItem:menuItem]; @@ -390,7 +390,7 @@ [menuItem release]; /* Put menu into the menubar */ - windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; + windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent: @""]; [windowMenuItem setSubmenu:windowMenu]; [[NSApp mainMenu] addItem:windowMenuItem]; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/schismtracker-20230906/sys/posix/schismtracker.1 new/schismtracker-20231029/sys/posix/schismtracker.1 --- old/schismtracker-20230906/sys/posix/schismtracker.1 2023-09-07 02:58:17.000000000 +0200 +++ new/schismtracker-20231029/sys/posix/schismtracker.1 2023-10-29 03:15:05.000000000 +0100 @@ -23,25 +23,6 @@ this is different from the video driver setting within the program, and is unlikely to be useful. .TP -\fB\-\-video\-yuvlayout\fP=\fILAYOUT\fP -Specific YUV layout to use: \fIYUY2\fP, \fIYV12\fP, \fIRGBA\fP, etc. -This is probably best left alone under normal circumstances. -.TP -\fB\-\-video\-size\fP=\fIWIDTH\fPx\fIHEIGHT\fP -Set the size of the video display. -.TP -\fB\-\-video\-stretch\fP=\fIVALUE\fP -Fix the aspect ratio. (Probably does nothing!) -.TP -\fB\-\-video\-gl\-path\fP=\fIPATH\fP -Specify path of OpenGL library. -.TP -\fB\-\-video\-depth\fP=\fIDEPTH\fP -Specify display depth, in bits. -.TP -\fB\-\-video\-fb\-device\fP=\fIDEVICE\fP -Specify path to framebuffer. Typical value is \fI/dev/fb0\fP. -.TP \fB\-\-network\fP, \fB\-\-no\-network\fP Enable/disable networking (on by default). Used for MIDI over IP. .TP @@ -49,9 +30,6 @@ Start Schism Tracker in "classic" mode, or don't. This is mostly cosmetic, although it does change the program's behavior slightly in a few places. .TP -\fB\-\-display\fP=\fIDISPLAY\fP -X11 display to use. -.TP \fB\-f\fP, \fB\-F\fP, \fB\-\-fullscreen\fP, \fB\-\-no\-fullscreen\fP Enable/disable fullscreen mode at startup. .TP @@ -69,10 +47,6 @@ \fB\-\-hooks\fP, \fB\-\-no\-hooks\fP Run hooks. Enabled by default. .TP -\fB\-\-debug\fP=\fIFLAGS\fP -Enable some debugging flags (separated by commas). -You probably don't need this. -.TP \fB\-\-version\fP Display version information and build date. .TP @@ -232,6 +206,9 @@ WAV Microsoft WAV audio .TP +FLAC +Xiph.Org Free Lossless Audio Codec audio +.TP AIFF Audio IFF (Apple) .TP