Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[IMPORTANT] Release reference implementation before everything else #117

Open
spessasus opened this issue Feb 9, 2025 · 53 comments
Open
Assignees
Labels
communication Communication with others
Milestone

Comments

@spessasus
Copy link
Collaborator

spessasus commented Feb 9, 2025

https://forum.openmpt.org/index.php?topic=7297.new#new

Saga is right about one thing: we need the reference implementation now.

In hindsight, it's really silly of us to not think of that earlier. How can we release the spec before the reference implementation? Think about the developers:

  • they may interpret some things differently, whereas with the reference in place, they will do exactly what it does if the spec is unclear, thus unifying the underspecified behavior
  • the spec may have some errors and unclear things. If we implement it, we can actually test the spec to iron out the discrepancies and errors without a problem.
  • easier adoption: code may be easier for the developers to read than the speciation, making them more likely to adopt the standard.
  • actually checking if stuff is possible: as Saga has pointed out, some features conflict and are impossible and some others such as mp3 support are flawed. Actually implementing the spec would show us the viable approaches and rule out what's not.

So yeah, we shouldn't announce SFe as released until the reference implementation is done.

@spessasus spessasus added the communication Communication with others label Feb 9, 2025
@spessasus spessasus added this to the 4.0 post-release milestone Feb 9, 2025
@sylvia-leaf
Copy link
Collaborator

Alright, I've renamed the SFe 4.0 release to "SFe 4.0 (pre-release)". Update 4 should be the final release. Apologies for all the inconvenience!

@sylvia-leaf sylvia-leaf moved this to In progress in SFe 4 format Feb 10, 2025
@Cacodemon345
Copy link

I'd honestly prefer if the reference implementation was also in at least Rust or C/C++. Many, many people deeply dislike the JavaScript language, me included; code written in it is harder to understand and reuse for non-JS projects targeting native platforms or WASM.

It also doesn't help that the spec lacks a section summarizing ALL differences from SF3 and the earlier SF2 specification. For example, I had to travel rather down to see flags indicating FLAC, Opus, Vorbis and MP3 support. It definitely didn't help that this release felt very underwhelming; simply adding more sample formats and dealing with CC# 0/32 banks doesn't make it worthy of a 4.0 release in my opinion. Silicon SoundFonts should be removed from the spec completely; nobody seriously needs it. On the contrary, it should also aim to surpass the DLS specifications and target MIDI 2.0 features (adding per-note-controller sources for custom modulators with explicit text in the spec to override per-channel sources would be useful for example, also handling pitch-attribute-to-generator cases would be helpful as well). Excess bloat from the AWE32 days should be trimmed down wherever possible.

I'm merely sharing my 2/4 cents on the spec here; I don't have much of a horse in the race except for developing VSBHDASF's fork of TinySoundFont. Only other thing I'd suggest is to make it implementable with the bare minimal amount of code needed to properly support new SFe features, since many projects for retro games with MIDI support are less likely to tolerate huge libraries just to render music. I'd also suggest putting in example code for new features in the spec itself to speed up adoption and implementation but it probably won't be very useful.

@spessasus
Copy link
Collaborator Author

spessasus commented Feb 10, 2025

I'd honestly prefer if the reference implementation was also in at least Rust or C/C++. Many, many people deeply dislike the JavaScript language, me included; code written in it is harder to understand and reuse for non-JS projects targeting native platforms or WASM.

I think that we are going to stick to JS for a few reasons:

  • First of all, it's a matter of personal preference. Many people deeply dislike the C language, me included; code written in it is harder to understand and I really don't feel like wasting time on catching memory leaks and segmentation faults, as it has happened to me more times than I'd like to admit. Is that a skill issue on my part? Maybe, but using JS just allows us to focus on what's important which is the functionality.
  • Secondly, there just isn't much to base the implementation upon. Here are a few that won't suit our needs:
  • RustySynth violates the soundfont standard by omitting a major feature: modulators. This is a very big feature to implement and it would take a lot of time, which would be wasted as the JS implementation we're basing SFe's upon already has them properly implemented and tested.
  • TinySoundFont: It also violates the SF2 standard and also does not support modulators.
  • FluidSynth: This the only fully compliant SF2 synth written in C as far as I know, so it would make a good base for the reference implementation, but with one exception: It does not support writing SF2 files. This is a problem, because the reference implementation would be pretty useless without being able to write SFe 4 files, now wouldn't it?

All these problems are solved with the current JS synth we're forking: it supports modulators, SF3 compression, is fully compliant and allows both reading and writing SF2 files.

Not to mention one last thing: I can't speak for other members, but I just don't know C very well. It's kind of hard to write a complex C program without knowing the language, isn't it?

Though if you are really fixated on software written in C/C++, then you can wait for Polyphone 3 to be released as it will be the first SFe editor. And it's written in C++ :-)

@Cacodemon345
Copy link

Cacodemon345 commented Feb 10, 2025

It's fine if you stick to JS only, but I expect friction from all other implementers that are less familiar with the language itself, slowing down adoption.

TinySoundFont and everything that used it as a reference will not have modulators (RustySynth, MeltySynth and ZiggySynth uses it as one); it was a deliberate decision to not hog low-end hardware.

@spessasus
Copy link
Collaborator Author

It's fine if you stick to JS only, but I expect friction from all other implementers that are less familiar with the language itself, slowing down adoption.

We could try to port the complete thing into other languages after it's done, maybe that would help? That way we're just "translating" JS to other languages and the outcome would be the same? That would be later down the line, though. After the spec is tested via the reference implementation, refined and properly released. But I don't see why we wouldn't do it :-)

@sylvia-leaf
Copy link
Collaborator

Thank you everyone for all the feedback!


Cacodemon's comments

the spec lacks a section summarizing ALL differences from SF3 and the earlier SF2 specification

This is a problem. We will add a section that summarises everything you need to know in specification update 4. Stay tuned!

simply adding more sample formats and dealing with CC# 0/32 banks doesn't make it worthy of a 4.0 release in my opinion

I understand why you thought the 4.0 release was "underwhelming" - in fact, the original scope of the SFe specification as planned in 2020 was far wider, including:

  • significantly larger sample/instrument/preset names
  • 32-bit pbag/ibag
  • instrument categories
  • 64-bit sample address for 64-bit banks
  • multiple loop points
  • round robin sampling
  • advanced filters
  • more modulation LFO types
  • advanced conditional starts
  • initial attenuation control
  • more sample playback/looping modes
  • exclusive class control
  • many extra DSP effects
  • reverb/chorus types
  • a general value with random numbers
  • new controller source types.

Because adding so many features at once would make it even harder to create a reference implementation, and would likely overwhelm developers that want to make their programs compatible with SFe, we decided to only include the most important new features in the initial 4.0 release. However, many of the features originally planned for SFe 4.0 will appear in future releases:

  • SFe 4.2 will have exclusive class control, initial attenuation control, sample playback/looping modes and round robin sampling.
  • SFe 4.3 will have advanced filters.
  • SFe 4.4 will have 32-bit pbag/ibag using chunk override, and true 64-bit sample addressing.
  • SFe 4.7 will have advanced conditional starts.

Some of the above planned features, such as increased name size and multiple loop points, were deemed to make the file incompatible with legacy SF2.04, and were thus cut entirely. They will be reintroduced in a later version.

Silicon SoundFonts should be removed from the spec completely; nobody seriously needs it

Talking about SiliconSF, despite our research concluding that no-one ever used it, one of the members of the SFe Team would rather it be kept in.

However, what we can do is to move it to a separate specification, like we did with TSC, which was an older workaround to the 4GB limit inherent in 32-bit file formats (before we concluded 64-bit and later still, dynamic, was the future). We'll keep the AWE ROM emulator specification in because it may be useful to run really old SF2.0x banks, and we also plan on adding new, modern features that take advantage of the infrastructure of what used to be ROM samples.

it should also aim to surpass the DLS specifications

Well, with SFe 4.2, we plan on incorporating SynthFont Custom Features (SFCF), a set of functions implemented by Kenneth Rundt's SF programs (including SynthFont and Viena) that includes DLS features, as well as playing the sample to the end. And by SFe 4.4, we want to have all of the DLS features that were not implemented in legacy SF2.04 added to the specification.

target MIDI 2.0 features

This is also something that we are interested in doing. There have apparently been plans by FluidSynth to extend SF2.04 to include support for MIDI 2.0, so I think the MIDI 2.0 support specification for SFe would need to be based on and be compatible with any future FluidSynth implementation. Remember that one of the main purposes of SFe 4 is to be one specification which encompasses as many existing extensions to the legacy SF2.04 format.


Spessasus's comments

segmentation faults

Do I need to say anything about Segfaults? They are annoying. That being said, Cacodemon mentioned Rust, which should have sufficient memory safety to ensure that such an error doesn't happen.

I just don't know C very well

Well, I don't know JS too well either. So, I think that it's a good idea to have reference implementations in multiple programming languages. Spessasus mentions that we can make an implementation off Polyphone, which is written in C++.


Questions

  • Do you think that we also need a reference implementation for an SFe editor similar to Polyphone? Or do you think that just the player and writer is fine? As Spessasus mentioned, there have been talks about a possible 3.0 version that accepts SFe, so should we PR the required changes to Polyphone and let Davy handle the rest? Or should we wait a bit until the other reference implementations are completed?

  • What do you think about an integrated development environment for SFe? This would be one program that contains an editor, reader, writer, player and other tools written to the file conversion and repair specifications listed in SFe, along with possibly many other things.

  • @stgiga There have been concerns about how much legacy AWE32 things have been left in the specification, including SiliconSF. Do you think that it's ok to move SiliconSF into a separate specification, or should it stay there?

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

I'm issuing an automatic VETO on removing SiliconSF. The whole "nobody needs it" argument is fallacious and pedantic.

SiliconSF will stay. It's a real version of a long-standing idea I had of SoundFonts on chips. Removing it is equivalent in my view to confiscating my computer as someone whose life is computers, and will not be tolerated here.

Verdict: WONTFIX, and you can't change that. I spent hours studying the spec. I'm not throwing THAT away for anyone.
Nor can you. Getting rid of SiliconSF will be treated by me as vandalism, so DO NOT try doing so.

SECONDLY:
I've written stuff in JS (I like it better than other languages), though not quite on this level, but getting there.

@sylvia-leaf @Cacodemon345

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

Sorry if I'm a bit heated, but the whole "it's redundant/useless" is EXACTLY how enshittification starts (cutting stuff just because it is "unimportant"), and I will NOT be party to that. No examples are wanted.

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

Remember, our goal is to add features, NOT remove them. Removing SiliconSF would defeat the purpose. So please don't.

@spessasus
Copy link
Collaborator Author

spessasus commented Feb 10, 2025

Sylvia asked for splitting up the SiliconSF, similarly to what we did with TSC, not outright removal. Are you against that as well?

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

Sylvia asked for splitting up the SiliconSF, similarly to what we did with TSC, not outright removal.

But even that isn't necessary. Look, there is literally NO reason to remove or split SiliconSF, other than some people thinking it is useless. TSC on the other hand is something I like, but the separation reasons have some basis in reality. Meanwhile there is NO rational reason to remove SiliconSF or even isolate it. It does absolutely zero harm, and it isn't lawyering the SF2 spec's wording like TSC (not that I hate it). It even ADDS stuff like checksums and the Style field. Why the HELL would we throw away an upgrade for no reason based on rational thought.

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

Please don't enable enshittification with the "redundant"/"useless" reasoning.

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

Image

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

@spessasus
Copy link
Collaborator Author

Alright, I got it reading your first message, Stgiga. You want SiliconSF to stay. That image and comparing removing a feature to Russian roulette was unnecessary as you've already made your point.

I personally am indifferent to this, as it doesn't hurt to give it a try. But since you're very interested in the SiliconSF, I hope that you will help in implementing it in the reference implementation. If it works and proves to be effective, great. If not, we'll think about it later.

@sylvia-leaf
Copy link
Collaborator

We've had a strong response against (re)moving SiliconSF. Therefore, it's going to stay. However, because we recognise that many programs will not be implementing it, it will only be a requirement to meet level 4 of SFe compatibility.

I never wanted to remove it anyway, because while many people may not be using it, I wanted to to build features on top of the infrastructure in the future anyway.

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

In my defense, I'm sort of unhappy with IRL matters too, so sorry for being the next Linus Torvalds.

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

Namely, it's an issue with my group project in uni. The details don't need mentioning.

@sylvia-leaf
Copy link
Collaborator

Don't worry, it's fine. But don't forget to stay calm, because it makes the SFe project look more presentable.

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

Definitely.

@stgiga
Copy link
Collaborator

stgiga commented Feb 10, 2025

I feel like I should go work on some stuff unrelated to the project so I can chill.

@sylvia-leaf
Copy link
Collaborator

Unfortunately due to my course of study at university I may not be able to get the reference implementation done for the next few weeks, but after this, hopefully I should be able to continue working on it.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

I think, most importantly, we SHOULD listen to the concerns that exist about elements of the standard. @sylvia-leaf

There are QUITE a few things we could have and should have done better, and that has been made clear. It turns out that what prompted this entire Github issue wasn't even everything that there had been some objection to.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

Unfortunately there's been some pushback and I was low on time to do this but apparently we are supposed to remove saga from the credits. So I did. @sylvia-leaf

https://forum.openmpt.org/index.php?topic=7297.new#new

@spessasus
Copy link
Collaborator Author

Note that this will probably upset the team, but
reading this thread seems to suggest the following for the format to be accepted by OpenMPT and to be considered modern by them:

  • removing SFe4 in its entirety as it is and starting over from scratch (i.e. SFe 5, but probably under a different name)
  • dropping SF2 compability and completely reinventing the wheel (again, what SFe 5 was meant to be)
  • collaborate with related developers as we create the spec, releasing betas and discussing any minor or major changes as we go on
  • dropping SiliconSF (stgiga will not like this, but I also just don't see a point of ROM samplers in 2025. This is supposed to be a new format that rivals stuff like Kontakt)
  • dropping all the varians, like 32 bit, RIFX and others (I also agree with that one)
  • dropping RIFF and replacing with XML or JSON, something easy to parse (it's a cool idea, but how would we store the sample data?)
  • reducing audio formats significantly (wav, opus and flac only?)
  • create a complete implementation and testing the spec in practice before marking the spec as complete (this issue)

so, what now? Do we keep going with SFe4 or do we start from scratch and create a new sound bank file format?

@Cacodemon345
Copy link

I somewhat agree with manx's assessment of the spec to be honest.

The main criticisms IMO to focus on should be:

  1. Significantly simplify the sample format. It shouldn't become an over-complicated mess. There shouldn't be any edge cases to deal with.
  2. Make it possible to determine the uncompressed sample sizes if possible.
  3. Ignore sample-rate specification in the base presets if the blocks are compressed.
  4. Make it so that implementations only have to deal with 16-bit integer or 32-bit floating point samples.
  5. All compressed samples should follow the barest minimum subset needed to be able to be decoded fast (which means that metadata stuff should never belong there at all unless absolutely necessary).
  6. LAME/Xing extensions should be made mandatory for MP3 playback.
  7. Use RIFF64 and stick with it. Or make a custom variant that isn't FourCC-laden crap and strictly little-endian.

I disagree with the idea of dropping SF2 baggage completely; this will cause the concept-to-implementation stage to take too long for existing SoundFont synths.

@spessasus
Copy link
Collaborator Author

Use RIFF64 and stick with it. Or make a custom variant that isn't FourCC-laden crap and strictly little-endian.

take a look at this

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

Note that this will probably upset the team, but reading this thread seems to suggest the following for the format to be accepted by OpenMPT and to be considered modern by them:

  • removing SFe4 in its entirety as it is and starting over from scratch (i.e. SFe 5, but probably under a different name)
  • dropping SF2 compability and completely reinventing the wheel (again, what SFe 5 was meant to be)
  • collaborate with related developers as we create the spec, releasing betas and discussing any minor or major changes as we go on
  • dropping SiliconSF (stgiga will not like this, but I also just don't see a point of ROM samplers in 2025. This is supposed to be a new format that rivals stuff like Kontakt)
  • dropping all the varians, like 32 bit, RIFX and others (I also agree with that one)
  • dropping RIFF and replacing with XML or JSON, something easy to parse (it's a cool idea, but how would we store the sample data?)
  • reducing audio formats significantly (wav, opus and flac only?)
  • create a complete implementation and testing the spec in practice before marking the spec as complete (this issue)

so, what now? Do we keep going with SFe4 or do we start from scratch and create a new sound bank file format?

I'm overruling you on SiliconSF removal, otherwise I don't have any objections.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

I'm going to amend the policy to say that feature removal is considered vandalism.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

I hate having to go full Linus Torvalds on the issue, but actively downgrading from SF2 is counterintuitive to our goal to extend SF2. Other changes are fine, but actively removing features is completely against this whole project and shall never be attempted or considered. No examples are wanted.

@Cacodemon345
Copy link

Use RIFF64 and stick with it. Or make a custom variant that isn't FourCC-laden crap and strictly little-endian.

take a look at this

I did, and it seems wildly pointless to be honest; quad-word fields for size is enough for everything.

Instead of that, I'd suggest this:

typedef struct {
    uint16_t strLenOfCC; // length of string identifier.
    char nameCC[strLen]; // strictly ANSI-only.
    uint32_t chunkSizeLow; // same as in RF64
    uint32_t chunkSizeHigh; // same as in RF64
} Riff64Named;

nameCC would have to be hashed internally if needed, but it'd solve the FourCC concerns I believe, without inviting JSON/XML baggage to entire projects.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

Also, there are reasons why my personal Discord has an ironclad rule about not endlessly picking holes into things.

This isn't a blanket dismissal of the fact that work needs to be done, but what it IS is a line-item permanent veto of downgrades.

@spessasus
Copy link
Collaborator Author

I don't want to be rude, but isn't the point of this whole project to collaborate with others? Because so far your actions can be summed up as: nope, I don't agree and I have write perms and you don't so you will listen to me.

The whole point of this was to collaborate with others to create a new format. Collaboration means discussing stuff with others. You for example didn't name one reason for siliconSF to stay as a required part of the SFe spec.

Quoting you:

Verdict: WONTFIX, and you can't change that. I spent hours studying the spec. I'm not throwing THAT away for anyone.
Nor can you.

So again, is this solely your project or is it a collaborative effort? Because I'm starting to think that it's the former. Telling other team members what they can and can't do does sound a bit like a power trip, no? No explanations, no reasoning, just because I said so.

Again, nobody said to entirely delete what you've created. There were ideas of splitting it up as its own thing, but you said no and nobody can say anything.

Please, at least give a good reason for SSF to be an integral part of the spec, a reason that will make developers want to implement it and support it. That's all I'm asking for.

@Cacodemon345
Copy link

I hate having to go full Linus Torvalds on the issue, but actively downgrading from SF2 is counterintuitive to our goal to extend SF2. Other changes are fine, but actively removing features is completely against this whole project and shall never be attempted or considered. No examples are wanted.

Would you be fine with it being mandatory for Level 5 compatibility as opposed to Level 4? Level 5 would mandate Level 4 + SiliconSF, but Level 4 would make it strictly optional but make everything else mandatory to implement.

I mean, some level of concession has to be made; you appear to be trying to fight a war on the losing side against at least 3/4 stakeholders not wanting SiliconSF stuff to exist in 2025.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

It's collaborative, but in this case removing SiliconSF is an action directly against our goal of adding features, and shouldn't be on the table.

Also wasn't Format Levels part of the contention to begin with.

But sure, like another removal I objected to, I'll allow it to not be completely removed, rather delegated. But removing it completely == vandalism.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

By the way, of the two isolations I allow, permanent complete removal of either will be rolled back for being out-of-scope.

@Cacodemon345
Copy link

At least that's better than telling everyone to implement it for full-spec compliance.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

I hate being Linus here, but we are extending SF2, not trimming it.

Keep in mind that I'm the person who thinks channel count on Discord servers is a non-concern.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

I apologize for the contention, I just felt like we shouldn't go against the entire purpose of the project.

Honestly these days I've been a bit on-edge for unfortunate reasons having nothing to do with the Internet, so I may be a bit moody at times.

@sylvia-leaf
Copy link
Collaborator

So, there's been a lot of talk about the future of the SFe format and whether it is fit for purpose, or if we should start again from a non-soundfont-like format structure.

We want to place the foundations of the functioning of the SFe team and use SFe 4 to start things off. We won't throw away the entire legacy soundfont structure in SFe 5 - we'll gradually change the structure until it may or may not be unrecognisable from legacy soundfont. This could happen in SFe 6, SFe 7 or even SFe 10 for that matter, but it won't be SFe 5. SFe 5 will be for the most part relatively similar to SFe 4 and legacy soundfont, but will have the number 5 as it will not be compatible with legacy soundfont.


What I think

Spessasus comment 1:

removing SFe4 in its entirety as it is and starting over from scratch (i.e. SFe 5, but probably under a different name)
dropping SF2 compability and completely reinventing the wheel (again, what SFe 5 was meant to be)

The consensus here is that we want to make an NGMSS. The problem is that I attempted to make an NGMSS and couldn't do it. However, if I put some more effort into making one, then it can be an option.

Also, going straight to an NGMSS misses the point of SFe - extending the legacy soundfont format to give it a few more important features, and then building from there.

collaborate with related developers as we create the spec, releasing betas and discussing any minor or major changes as we go on

Yeah, we should've done this first. But we can do this for the significant bugfixes to the specification.

dropping SiliconSF

Not happening. We may replace it with a new system that achieves the same thing while being far more expansible, but this is a part of SFe 4.0 that will stay. However, the reference implementation will need to be able to read it.

dropping all the variants, like 32 bit, RIFX and others

For now, what I'll do is to remove big endian support, leaving just 32-bit RIFF and 64-bit RIFF. In a later version, we then use Spessasus's dynamic RIFF-like format, which is optional for SFe 4.x and required for SFe 5.x and later and potentially even later versions of SFe 4.x. This immediately means that the reference implementation for RIFF-like chunk formats is complete. The conclusion is that this will be done for SFe 5.x.

RIFF64 is very easy to implement, however RIFF dynamic allows almost infinite scaling of the format and results in fewer unused bytes. Using dynamic field sizes throughout the format can also result in significant size optimisations elsewhere. RIFF dynamic can also be the starting point of a new format that fixes inherent problems of RIFF-like formats.

dropping RIFF and replacing with XML or JSON, something easy to parse

Such a format already exists. It's called SFZ. If we wanted to do that, then we should've based SFe on SFZ instead. That being said, higher SFe abstraction levels (in the future) are planned to be SFZ-based and by their very nature will be like this.

reducing audio formats significantly

This is a good idea. We don't expect program developers to implement rarely used compression algorithms.

Cacodemon comment 1:

Significantly simplify the sample format. It shouldn't become an over-complicated mess. There shouldn't be any edge cases to deal with.

Because SFe 4 is designed to be mostly compatible with legacy SF2.04, we may be able to add a bitdepth value in ISFe-list and then allow programs to select either the legacy SF2.04 sample format, or to use a new flat format which only supports 8-bit, 16-bit and 32-bit samples of integer and float. Bank developers can then choose to either make their banks compatible with legacy SF players, or to make them SFe 4.x-specific (corresponding to sfbk and sfen).

Make it possible to determine the uncompressed sample sizes if possible.

This can be simply added to the metadata and will likely be defined in SFe 4.1 or 4.2.

Ignore sample-rate specification in the base presets if the blocks are compressed.

If what is meant by "sample-rate specification" the 400-50000 limit the SFe specification is already unaffected by this limitation.

All compressed samples should follow the barest minimum subset needed to be able to be decoded fast (which means that metadata stuff should never belong there at all unless absolutely necessary).

This would be one of the purposes of sfelint - to remove unnecessary metadata from samples.

LAME/Xing extensions should be made mandatory for MP3 playback.

No, we should focus on wav/opus/flac.

Use RIFF64 and stick with it. Or make a custom variant that isn't FourCC-laden crap and strictly little-endian.

This could be implemented by extending RIFF dynamic into something that doesn't rely on fourcc's.

Cacodemon comment 2:

I did, and it seems wildly pointless to be honest; quad-word fields for size is enough for everything.

The point of RIFF dynamic is not only to allow going beyond 64-bit, but also to save space by allowing 40-bit, 48-bit, 56-bit, etc.

We're also able to extend RIFF dynamic to fix the problem with fourcc's, but it needs to be done slowly to ensure that the target isn't moving too quickly for program developers to adapt to and causing a version fragmentation problem.

Spessasus comment 2:

I don't want to be rude, but isn't the point of this whole project to collaborate with others? Because so far your actions can be summed up as: nope, I don't agree and I have write perms and you don't so you will listen to me.

I agree with spessasus here. We shouldn't be rude to each other.

Cacodemon comment 3:

Would you be fine with it being mandatory for Level 5 compatibility as opposed to Level 4? Level 5 would mandate Level 4 + SiliconSF, but Level 4 would make it strictly optional but make everything else mandatory to implement.
I mean, some level of concession has to be made; you appear to be trying to fight a war on the losing side against at least 3/4 stakeholders not wanting SiliconSF stuff to exist in 2025.

This is something that we can and will do. The SFe reference implementation may be released initially without SiliconSF support, but it will eventually be available. It just won't be our priority.

In fact, there won't be a separate "level 5", it will be "level 4 with SiliconSFe". We chose four levels because that was the same number that the Spessasus/Falcosoft RMIDI specification included.

Stgiga comment 1:

It's collaborative, but in this case removing SiliconSF is an action directly against our goal of adding features, and shouldn't be on the table.

SiliconSF won't be removed but it will be explicitly made optional, similarly to TSC.


Other important things

Note that the feature set of 4.0 and 4.1 are already frozen. If we wanted to add these features to either 4.0 or 4.1 the "concept-to-implementation" time (as Cacodemon mentioned) would take even longer than it already does, considering other commitments on my part like my university degree, future projects or similar.

The changes that are outlined here will be made for the next update.

@stgiga
Copy link
Collaborator

stgiga commented Feb 20, 2025

I apologize for my stressed response.

@Cacodemon345
Copy link

Alienating the OpenMPT people with this mess of a spec and the miscommunication wasn't necessarily a good idea either (and it was indeed very bad). Best that can be done is attempting to get the FluidSynth guys on-board for this specification and fixing up all mistakes pointed out so far, and repairing the damage from miscommunication on the OpenMPT forums (no offense intended to stgiga).

Shame that MP3 is getting excluded; it'd allow significantly reducing the file size of soundfonts.

@spessasus
Copy link
Collaborator Author

Shame that MP3 is getting excluded; it'd allow significantly reducing the file size of soundfonts.

isn't opus better in like, every way? And MP3 is super old and saga mentioned that it could cause trouble during real-time decoding.

@sylvia-leaf
Copy link
Collaborator

I accept responsibility for the mess. But hopefully, we can fix it and make this something that everyone will want to implement in the future. Also, if you read the newly updated specification (Update 5), mp3 is listed as supported.

@spessasus
Copy link
Collaborator Author

spessasus commented Feb 20, 2025

We shouldn't use MP3 IMO, what advantages does it have over opus or vorbis?

Quoting saga's original response:

Why do you design a file format in 2025 that can contain MP3 samples, without even going into detail how you intend to address inherent problems of the MP3 format for this use case, such as encoder pre-delay and the inability to have samples of arbitrary length (unless you are using LAME/Xing extensions)? Both of these problems have already been solved by Ogg Vorbis, 25 years ago.

They are right about that one, and also this introduces another codec to add as a dependency, which will increase the size of programs, such as a web synth like the reference implementation. I propose we remove MP3 as there's simply no reason to use it over vorbis or opus. Both are widely supported, open, and have better compression rates, without having problems saga mentioned.

Edit 2: I am mostly against mp3 because having yet another codec will greatly increase the size of my web app and this is something I very much want to avoid.

@Cacodemon345
Copy link

Shame that MP3 is getting excluded; it'd allow significantly reducing the file size of soundfonts.

isn't opus better in like, every way? And MP3 is super old and saga mentioned that it could cause trouble during real-time decoding.

Now that you mention it, if Opus is supported MP3 support shouldn't matter.

https://web.archive.org/web/20200530160052/https://stsaz.github.io/fmedia/audio-formats/

At least Opus managed to have lesser file size than MP3 and the latter was objected to so MP3 can be dropped.

@stgiga
Copy link
Collaborator

stgiga commented Feb 21, 2025

Oh and Silicon's Style and integrity checksum fields are useful even in non-Silicon contexts, just so you know.

@stgiga
Copy link
Collaborator

stgiga commented Feb 23, 2025

I'm going to attempt fixing Enchant and Eternal to support SC-8850 in a single part @sylvia-leaf

Which parts contain what?

https://archive.org/download/soundfonts-kor-ninja/Enchant%21%20%5BEOL%5D/ has Enchant in full.

@stgiga
Copy link
Collaborator

stgiga commented Feb 23, 2025

Well it doesn't fit, even after trimming everything that isn't SC-88x.

@stgiga
Copy link
Collaborator

stgiga commented Feb 23, 2025

See, you never released a bank that went for 8850 all in one file.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
communication Communication with others
Projects
Status: In progress
Development

No branches or pull requests

4 participants