diff --git a/LICENSE-FINAL.md b/LICENSE-FINAL.md new file mode 100644 index 0000000..4a59964 --- /dev/null +++ b/LICENSE-FINAL.md @@ -0,0 +1,11 @@ +Copyright © 2020-\[year\] SFe Team and contributors + +Permission is granted to use, distribute and modify this specification for any use, provided that: + +- you attribute the SFe Team (do not remove copyright notices) +- you clearly mark any modifications that are made to the specification +- you share all modifications implemented in a program under this license +- you do not remove the link to the latest version of the specification +- you do not claim that we're affiliated with E-mu or Creative Labs. + +This specification is provided "as-is" without any warranty. \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..cca1bf3 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,12 @@ +Copyright © 2020-2024 SFe Team and contributors + +Permission is granted to use, distribute and modify this draft specification for any use, provided that: + +- this specification is clearly marked as a draft +- you attribute the SFe Team (do not remove copyright notices) +- you clearly mark any modifications that are made to the specification +- you share all modifications implemented in a program under this license +- you do not remove the link to the latest version of the specification +- you do not claim that we're affiliated with E-mu or Creative Labs. + +This specification is provided "as-is" without any warranty. \ No newline at end of file diff --git a/sfe-logos/SFe32-colour.png b/sfe-logos/SFe32-colour.png new file mode 100644 index 0000000..687d944 Binary files /dev/null and b/sfe-logos/SFe32-colour.png differ diff --git a/sfe-logos/SFe32.png b/sfe-logos/SFe32.png new file mode 100644 index 0000000..4fa74cd Binary files /dev/null and b/sfe-logos/SFe32.png differ diff --git a/sfe-logos/SFe64-colour.png b/sfe-logos/SFe64-colour.png new file mode 100644 index 0000000..10672da Binary files /dev/null and b/sfe-logos/SFe64-colour.png differ diff --git a/sfe-logos/SFe64.png b/sfe-logos/SFe64.png new file mode 100644 index 0000000..0e5232f Binary files /dev/null and b/sfe-logos/SFe64.png differ diff --git a/sfe-logos/SFe64L-colour.png b/sfe-logos/SFe64L-colour.png new file mode 100644 index 0000000..a5e277c Binary files /dev/null and b/sfe-logos/SFe64L-colour.png differ diff --git a/sfe-logos/SFe64L.png b/sfe-logos/SFe64L.png new file mode 100644 index 0000000..9e8561e Binary files /dev/null and b/sfe-logos/SFe64L.png differ diff --git a/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index 79a869e..d7f3878 100644 --- a/sfe32-latest/format-specification/sfe-format-specification.md +++ b/sfe32-latest/format-specification/sfe-format-specification.md @@ -1,10 +1,10 @@ # SF-enhanced 32-bit (SFe32) specification -## Version 4.00.8 (draft specification) +## Version 4.00.9a (draft specification) - November 2024 -Copyright 2020-2024 SFe Team +Copyright © 2020-2024 SFe Team and contributors -Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems Inc. +Based on the abandoned E-mu spec (Copyright © 1994–2002 E-mu Systems Inc.) * * * @@ -13,7 +13,8 @@ Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems In | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| 4.00.8a | October 30, 2024 | Started to fix SFe RIFF structure for 4.1-4.4
Removed RF64 reference for SFe32.
Now consistent with WernerSF3 | +| 4.00.9a | November 14, 2024 | Changed versioning rules in 5.1a to make it easier for programs to detect version numbers.
Updated definitions of "case-insensitive" and "case-sensitive" to use UTF-8 instead of Ascii.
7.2, 7.6 and 7.10 now use UTF-8 instead of ascii.
Changed wPreset to use the ISFe bank for implementation in 4.04.
Because the preset library management system values are DWORDs, reworking them for 4.05.
Added license
Re-added 9.7 from SF2.04 with updated information about implementation accuracy
Clarified incompatibility of cognitone-formatted banks
Changed format extensions
Defined a fully-compatible feature subset of SFe32 (SFe32L)
Changed ISFe-list sub-chunk to a list
Added SFty sub-chunk in ISFe-list sub-chunk | +| 4.00.8 | October 30, 2024 | Started to fix SFe RIFF structure for 4.1-4.4
Removed RF64 reference for SFe32.
Now consistent with WernerSF3 | | 4.00.7c | October 17, 2024 | First 32-bit specification with structural changes from SFe64.
Fixed some more things
Name update | | 4.00.7b | October 12, 2024 | Updated program SFe32-to-SFe64 specification
Fix capitalisation in 1.5a
Remove extraneous table of contents entries
Fix more registered trademark symbols
| | 4.00.7a | October 10, 2024 | Table of contents added
Merge the pages into one
Fix the typos and formatting
Special thanks for spessasus for authoring these changes!
| @@ -69,6 +70,21 @@ This is a draft. Expect errors, and feel free to report them. Sylvia-leaf has ac Do not use "draft" specifications (version number x.yy.zL) to base final products on. Always refer to a "final" specification (version number x.yyL). +## 0.2a License + +Copyright © 2020-2024 SFe Team and contributors + +Permission is granted to use, distribute and modify this draft specification for any use, provided that: + +- this specification is clearly marked as a draft +- you attribute the SFe Team (do not remove copyright notices) +- you clearly mark any modifications that are made to the specification +- you share all modifications implemented in a program under this license +- you do not remove the link to the latest version of the specification +- you do not claim that we're affiliated with E-mu or Creative Labs. + +This specification is provided "as-is" without any warranty. + * * * ## 0.3 Updates and comments @@ -102,6 +118,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [0.1 Revision history](#01-revision-history) * [0.1a Specification Versioning](#01a-specification-versioning) * [0.2 Disclaimers](#02-disclaimers) + * [0.2a License](#02a-license) * [0.3 Updates and comments](#03-updates-and-comments) * [0.3a SFe Team](#03a-sfe-team) * [0.4 Table of contents](#04-table-of-contents) @@ -140,6 +157,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [5.10 "ICMT" subchunk](#510-icmt-subchunk) * [5.11 "ISFT" subchunk](#511-isft-subchunk) * [5.12 "ISFe" subchunk](#512-isfe-subchunk) + * [5.12.1 "SFty" sub-chunk](#5121-sfty-sub-chunk) * [Section 6: "sdta-list" chunk](#section-6-sdta-list-chunk) * [6.1a "smpl" sub-chunk](#61a-smpl-sub-chunk) * [6.1b About compression in SFe32](#61b-about-compression-in-sfe32) @@ -149,8 +167,9 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [Section 7: "pdta-list" chunk](#section-7-pdta-list-chunk) * [7.1 "Hydra" structure](#71-hydra-structure) * [7.2 "phdr" sub-chunk](#72-phdr-sub-chunk) + * [achPresetName Changes](#achpresetname-changes) * [wPreset Changes](#wpreset-changes) - * [wBank Changes](#wbank-changes) + * [wBank Changes (SFe32L)](#wbank-changes-sfe32l) * [Definitions of dwLibrary and dwGenre](#definitions-of-dwlibrary-and-dwgenre) * [Do not access the final sfPresetHeader entry](#do-not-access-the-final-sfpresetheader-entry) * [7.3 "pbag" sub-chunk](#73-pbag-sub-chunk) @@ -159,6 +178,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [7.5 "pgen" sub-chunk](#75-pgen-sub-chunk) * [New options for the SFGenerator enum](#new-options-for-the-sfgenerator-enum) * [7.6 "inst" sub-chunk](#76-inst-sub-chunk) + * [achInstName Changes](#achinstname-changes) * [7.7 "ibag" sub-chunk](#77-ibag-sub-chunk) * [7.8 "imod" sub-chunk](#78-imod-sub-chunk) * [New options for the SFModulator enum](#new-options-for-the-sfmodulator-enum-1) @@ -166,6 +186,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [7.9 "igen" sub-chunk](#79-igen-sub-chunk) * [New options for the SFGenerator enum](#new-options-for-the-sfgenerator-enum-1) * [7.10 "shdr" sub-chunk](#710-shdr-sub-chunk) + * [achSampleName Changes](#achsamplename-changes) * [Sample Rate Limit Changes](#sample-rate-limit-changes) * [sfSampleType and Werner SF3](#sfsampletype-and-werner-sf3) * [Section 8: Enumerators](#section-8-enumerators) @@ -193,6 +214,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [9.4 SF Generator Model](#94-sf-generator-model) * [9.5 SF Modulator Model](#95-sf-modulator-model) * [9.6 NRPN implementation](#96-nrpn-implementation) + * [9.7 On implementation accuracy](#97-on-implementation-accuracy) * [Section 10: Error-handling](#section-10-error-handling) * [10.1 Structural errors](#101-structural-errors) * [10.1a Duplicated preset locations within files](#101a-duplicated-preset-locations-within-files) @@ -262,7 +284,7 @@ New sections may be added in the future, depending on if radical changes are mad - compatibility with legacy SF players that fully implement the legacy SF specification will continue; all that is needed is usage of the sf2 extension, and it should be possible to load an SFe32 file, on existing software. - a version will not release if the resulting features break the forward compatibility of legacy soundfont players; we will test updates before releasing final versions. - compatible players will require a certain standard of features, which is in the separate SFe32 program specification. - +- a subset of features called SFe32L will include all SFe32 features that do not affect playback by legacy SF players. These are marked by the (SFe32L) suffix. * * * @@ -326,7 +348,7 @@ SFe32 (version 4) is designed for future improvements. - These will be done in a more liberal way than the conservative manner of the SoundFont® 2 updates that E-mu® has done. - SFe32 will have a reduced set of improvements, as it is designed to be completely backward compatible with SF2.04. -- No version of SFe32 will become incompatible with fully compliant SF2.04 software. +- No version of SFe32 will become incompatible with fully compliant SF2.04 software (when wMajor=2). - Eventually, we will permanently freeze SFe32, only if and when SFe64-compatible software has reached significant acceptance. - After the feature freeze, SFe32 will remain a dependable and stable format for software development to be based on. - To avoid over-stress of developers of the SFe Team, as well as SFe instrument banks, features will be spread out across versions. We hope to release a new version every 3-5 years. @@ -342,8 +364,7 @@ We decided to do a feature freeze for version 4.00 to make sure that SFe program Here are a few things that are planned for SFe: -- An SDK to assist SFe program developers with creating programs for the new format will be available with the version 4.00 final specification. - - The first part of this SDK including an implementation of SFe will release in 4.00.9. +- For version 4.00.10, we're going to introduce the feature flags system, a method of determining whether certain features are supported by a player. - For version 4.01, there will be an overhaul of the default modulators system, inspired by the [DMOD proposal by spessasus](https://github.com/davy7125/polyphone/issues/205). - A MIDI lyrics specification for MIDI players will become available in version 4.02. - We will negotiate with the Synthfont author Kenneth Rundt about getting the Synthfont Custom Features added for version 4.03. @@ -392,7 +413,13 @@ The synth terminology used in SFe32 version 4.00 is broadly the same as the E-mu These changes: - Articulation - Modulation of available parameters and usage of extra samples to produce expressive musical notes. + +- Case-insensitive - Indicates that a UTF-8 character or string treats alphabetic characters of upper or lower case as identical. + +- Case-sensitive - Indicates that a UTF-8 character or string treats alphabetic characters of upper or lower case as distinct. + - Downloadable - SF version 2, 3 or SFe file obtained from the internet. (Old meaning referred to the obsolete ROM system) + - MIDI Bank - Groups of up to 128 presets, which can be selected by the two MIDI "Bank Select" control changes (CC00 and CC32). And these removals: @@ -470,131 +497,136 @@ RIFF('sfbk' { LIST('INFO' { - ifil( - struct sfVersionTag - { - WORD wMajor; - WORD wMinor; - } - ); - isng(szSoundEngine:ZSTR); - irom(szROM:ZSTR); - iver( - struct sfVersionTag - { - WORD wMajor; - WORD wMinor; - } - ); - ICRD(szDate:ZSTR); - IENG(szName:ZSTR); - IPRD(szProduct:ZSTR); - ICOP(szCopyright:ZSTR); - ICMT(szComment:ZSTR); - ISFT(szTools:ZSTR); - ISFe( - struct sfeSubchunk - { - // Not defined for 4.00.8, implementation due for 4.00.10 - } - ); + ifil( + struct sfVersionTag + { + WORD wMajor; + WORD wMinor; + } + ); + isng(szSoundEngine:ZSTR); + irom(szROM:ZSTR); + iver( + struct sfVersionTag + { + WORD wMajor; + WORD wMinor; + } + ); + ICRD(szDate:ZSTR); + IENG(szName:ZSTR); + IPRD(szProduct:ZSTR); + ICOP(szCopyright:ZSTR); + ICMT(szComment:ZSTR); + ISFT(szTools:ZSTR); + LIST('ISFe' + { + SFty(szSFeType:ZSTR); + flag( + // Not defined until 4.00.10 + ); + prsw( + // Not defined until 4.05 + ); + } + ); } ) LIST('sdta' { - smpl(); + smpl(); } { - sm24(); + sm24(); } { - sm32(); + sm32(); } ) LIST('pdta' { - phdr( - struct sfPresetHeader - { - CHAR achPresetName[20]; - WORD wPreset; - WORD wBank; - WORD wPresetBagNdx; - DWORD dwLibrary; - DWORD dwGenre; - DWORD dwMorphology; - } - ); - pbag( - struct sfPresetBag - { - WORD wGenNdx; - WORD wModNdx; - } - ); - pmod( - struct sfModList - { - SFModulator sfModSrcOper; - SFGenerator sfModDestOper; - SHORT modAmount; - SFModulator sfModAmtSrcOper; - SFTransform sfModTransOper; - } - ); - pgen( - struct sfGenList - { - SFGenerator sfGenOper; - genAmountType genAmount; - } - ); - inst( - struct sfInst - { - CHAR achInstName[20]; - WORD wInstBagNdx; - } - ); - ibag( - struct sfInstBag - { - WORD wInstGenNdx; - WORD wInstModNdx; - } - ); - imod( - struct sfInstModList - { - SFModulator sfModSrcOper; - SFGenerator sfModDestOper; - SHORT modAmount; - SFModulator sfModAmtSrcOper; - SFTransform sfModTransOper; - } - ); - igen( - struct sfInstGenList - { - SFGenerator sfGenOper; - genAmountType genAmount; - } - ); - shdr( - struct sfSample - { - CHAR achSampleName[20]; - DWORD dwStart; - DWORD dwEnd; - DWORD dwStartloop; - DWORD dwEndloop; - DWORD dwSampleRate; - BYTE byOriginalKey; - CHAR chCorrection; - WORD wSampleLink; - SFSampleLink sfSampleType; - } - ); + phdr( + struct sfPresetHeader + { + CHAR achPresetName[20]; + WORD wPreset; + WORD wBank; + WORD wPresetBagNdx; + DWORD dwLibrary; + DWORD dwGenre; + DWORD dwMorphology; + } + ); + pbag( + struct sfPresetBag + { + WORD wGenNdx; + WORD wModNdx; + } + ); + pmod( + struct sfModList + { + SFModulator sfModSrcOper; + SFGenerator sfModDestOper; + SHORT modAmount; + SFModulator sfModAmtSrcOper; + SFTransform sfModTransOper; + } + ); + pgen( + struct sfGenList + { + SFGenerator sfGenOper; + genAmountType genAmount; + } + ); + inst( + struct sfInst + { + CHAR achInstName[20]; + WORD wInstBagNdx; + } + ); + ibag( + struct sfInstBag + { + WORD wInstGenNdx; + WORD wInstModNdx; + } + ); + imod( + struct sfInstModList + { + SFModulator sfModSrcOper; + SFGenerator sfModDestOper; + SHORT modAmount; + SFModulator sfModAmtSrcOper; + SFTransform sfModTransOper; + } + ); + igen( + struct sfInstGenList + { + SFGenerator sfGenOper; + genAmountType genAmount; + } + ); + shdr( + struct sfSample + { + CHAR achSampleName[20]; + DWORD dwStart; + DWORD dwEnd; + DWORD dwStartloop; + DWORD dwEndloop; + DWORD dwSampleRate; + BYTE byOriginalKey; + CHAR chCorrection; + WORD wSampleLink; + SFSampleLink sfSampleType; + } + ); } ) } @@ -611,7 +643,9 @@ The type definitions are identical to those used in SoundFont® version 2.04. ## 4.5a File format extensions -SFe32 files should use file extension .SFE32 if incompatible with legacy SF players, but use .SF2 or .SF3 if compatible. +The file format extension to use for SFe files is generally `.sft`, however SFe32 banks that only use the SFe32L subset of compatible features may continue to use `.sf2` or `.sf3`. `.sf4` is avoided due to incompatibility with cognitone formatted banks. + +When opening a bank with extension `.sft`, programs must determine the correct version to use. # Section 5: "info-list" chunk @@ -624,22 +658,24 @@ WORD wMajor = 2 or 3 (SFe32) - wMajor=3 is used if the Werner SF3 sample format is used. - Otherwise, use wMajor=2 -WORD wMinor = 128 (SFe32) +WORD wMinor = 1024 (SFe32) - Legacy SF players might not support wMajor=4. -- SFe32 files technically appear as Version 2.128/3.128. +- SFe32 4.00 files may technically appear as Version 2.1024/3.1024. +- Update for 4.00.9: the second byte now represents the specification version, so 128 has become 1024. + The size must be exactly 4 bytes. Reject files with an "ifil" subchunk that isn't 4 bytes as "Structurally Unsound". ### Using the specification version -Alternatively, the wMajor and wMinor can be set in the same way as the specification version, for example wMajor=4, wMinor=0 becomes wMajor=3, wMinor=128. +Alternatively, the wMajor and wMinor can be set in the same way as the specification version, for example version 4.00 becomes wMajor=4, wMinor=0. ### In case of missing ifil subchunk If the "ifil" subchunk is missing, either: -- Assume version 3.128 or 4.0. +- Assume version 3.1024 or 4.0. - Reject the file as "Structurally Unsound". * * * @@ -649,12 +685,15 @@ If the "ifil" subchunk is missing, either: In SFe32, you can use two rules. Either: - the value of wMajor remains 2 or 3, depending on if Werner SF3 is used - - The value of wMinor counts up from 128. + - The value of wMinor counts up from 1024. - It increases by one when a change is made to the format. - - Later versions of the specification (4.01 onwards) will include a translation table to convert specification versions to SFe32 versions. -- the value of wMajor and wMinor correspond to the specification version + - Each specification major version change will increase wMinor by 256. + - Example: version 5.02 of the specification would have a wMinor value of 1282. + - Use if you intend your SFe file to be used with legacy SF players, as some legacy players may not like wMajor != 2. +- the value of wMajor and wMinor correspond to the specification version. + - Use if you intend your SFe file to only be used with SFe players. -To signify that the SFe file has been created to a draft specification, please use the description. +To signify that the SFe file has been created to a draft specification, please use the description. Programs that are compliant with SFe must recognise both naming schemes. * * * @@ -664,7 +703,7 @@ A new default isng sub-chunk value is used in SFe: "SFe32 version 4" - SFe version 4 players should recognize this and remove the default velocity related filter used in SoundFont® 2.04. - The ten "Default Modulators" will also be disabled by default. The Default modulation definition will be added in SFe version 4.01. -- In the case of a missing isng chunk, files with an ifil sub-chunk with wMinor >= 128, assume an isng sub-chunk value of "SFe32 version 4." Don't assume "EMU8000." +- In the case of a missing isng chunk, files with an ifil sub-chunk with wMinor >= 1024, assume an isng sub-chunk value of "SFe32 version 4." Don't assume "EMU8000." Reject anything not terminated with a zero byte, and assume the value "SFe32 version 4." Do NOT assume "EMU8000" by default. @@ -765,9 +804,28 @@ Reject anything not terminated with a zero byte. Do NOT reject the file as "Stru ## 5.12 "ISFe" subchunk -This would contain additional metadata for SFe specific features. Currently, in version 4.00, this is empty. +The `ISFe-list` sub-chunk includes many different sub-chunks to show information about SFe-specific features. Generally, we use the `ISFe-list` sub-chunk to make it clearer that this kind of information is SFe-specific. + +Due to compatibility constraints, the `ISFe-list` sub-chunk is found inside the `INFO-list` subchunk, rather than as a fourth RIFF chunk. Legacy SF players may not support more than three main RIFF chunks. + +### 5.12.1 "SFty" sub-chunk + +The `SFty` sub-chunk is an optional sub-chunk identifying the variant of SFe the bank is formatted in. It contains a UTF-8 string of 256 or fewer bytes including one or two terminators of value zero to make the total byte count even. + +The `SFty` string is used by SFe-compatible players to assist in loading banks by telling the program what variant of SFe to load a bank as. -The first ISFe subchunk feature, the feature flags system, is planned for milestone 4.00.10. +The defined values of the `SFty` chunk are: + +- the 6 bytes representing `SFe32` as 5 UTF-8 characters followed by one zero byte. +- the 8 bytes representing `SFe32L` as 6 UTF-8 characters followed by two zero bytes. +- the 16 bytes representing `SFe32 with TSC` as 14 UTF-8 characters followed by two zero bytes. +- the 16 bytes representing `SFe32L with TSC` as 15 UTF-8 characters followed by one zero byte. + +The field should conventionally never be longer than 16 bytes. + +The UTF-8 should be treated as case-sensitive. In other words, `sfe32 with tsc` is not the same as `SFe32 with TSC`. + +If the SFty sub-chunk is missing, not terminated in a zero-valued byte, or its contents are an undefined value, other properties of the structure should be used to determine the variant of SFe that is in use. Do not assume `SFe32`; only use such a value when it is evident beyond a reasonable doubt that the file used is SFe32. * * * @@ -800,6 +858,8 @@ To implement compression in your SFe32 bank, please use [Werner SF3](https://git - Werner SF3 supports multiple different compression formats. - The "scom" sub-chunk found in specification versions 4.00.3 and earlier is now obsolete. - Incompatible SF compression formats (.sfark, .sfpack, .sf2pack, .sfq) are prohibited. You should use Werner SF3. +- When Werner SF3 is in use, the size of smpl is not required to be a multiple of two, and the surrounding LIST chunk isn't padded to a multiple of two. +- Because cognitone-formatted banks are not valid Werner SF3 banks, they are considered an incompatible SF compression format, and are therefore not allowed. * * * @@ -868,31 +928,30 @@ No major changes have been made to the structure itself. All nine of the sub-chu The size of this chunk is a multiple of 38 bytes. -Its structure is the same as in SF2.04. +Its structure is the same as in SF2.04. + +### achPresetName Changes + +- In SoundFont® 2.04, achPresetName must be an ASCII string. +- Now, UTF-8 replaces ASCII, allowing more characters to be written. ### wPreset Changes - In SoundFont® 2.04, bits 2–8 were used to select up to 128 instruments. Bits 1 and 9–16 were unused. -- Now, bits 10–16 can be used to select alternate banks. +- Now, bits 10–16 can be used to select alternate banks using the ISFe subchunk. - It's designed to be used with sysex or other commands corresponding to General MIDI extension resets. - What bits 9–16 do in version 4: - Bit 9 remains reserved. - - General MIDI™ one or two reset clears bits 10 and 11. - - Roland® GS® reset clears bit 10 and sets bit 11. - - Yamaha® XG® reset sets bit 10 and clears bit 11. - - Roland® CM-64™/CM-32L™ reset sets bits 10 and 11. - - Bit 12 is reserved for more MIDI commands in the future. For now, bit 12 should be written as clear. - - Bits 13–16 will not be defined. The author of the SF may use these at will with their own MIDI commands. - - MIDI sequencers will eventually be able to set or clear all bits from 10 to 16 using commands. + - Bits 10-16 are reserved for MIDI commands as defined in the ISFe subchunk. For now, these bits should be written as clear. - It allows you to run multiple standards that may conflict with each other. -### wBank Changes +### wBank Changes (SFe32L) -- Version 4.00.1 had a new field called wBank2. -- Now, wBank stores both m.s.b. and l.s.b. bank changes (CC00 and CC32), eliminating the need for wBank2. +- Version 4.00.1 had a field called wBank2. Any draft with wBank2 is now obsolete. +- Starting from 4.00.2, wBank stores both m.s.b. and l.s.b. bank changes (CC00 and CC32), eliminating the need for wBank2. - wBank is still a WORD. This change was possible as wBank is 16-bit, which is sufficient to store the 14-bit bank change space. We commend E-mu for being forward enough thinking to not use a CHAR/BYTE for bank selection. -- In SoundFont® 2.04, and SFe version 4.00.1, bit 1 was only used with bank 128 (for percussion), and bits 2–8 were used to select a single bank between 0 and 127. Bits 9–16 were unused. -- wBank is little endian. +- In SoundFont® 2.04 and 4.00.1, bit 1 was only used with bank 128 (for percussion), and bits 2–8 were used to select a single bank between 0 and 127. Bits 9–16 were unused. +- wBank, like other SFe values (for the most part?), is little endian. - Now, bit 9 is also a percussion toggle. If a bank/program change combination produces a different result for midi channel 10, bit 1 controls the percussion. - File editors should warn the user if this issue is found. - Bits 2–8 are now used to set the first bank change, and bits 10–16 are now used to set the second bank change. @@ -909,9 +968,9 @@ Its structure is the same as in SF2.04. Old 2.04 fields "dwLibrary" and "dwGenre" are now defined. - "dwLibrary" is for the overall name of the set of files contained in a library of SFe, version 4 files. - - For example, "SFe Collection!" (with appropriate zero bytes) + - This value will correspond to a list in an enum. This is planned for 4.05. - "dwGenre" is for the genre of music which the files are optimized for. - - For example, "Rock" (with appropriate zero bytes) + - This value will correspond to a list in an enum. This is planned for 4.05. - "dwMorphology" has been left out of this draft specification. It will eventually be re-introduced in a future version. ### Do not access the final sfPresetHeader entry @@ -982,6 +1041,11 @@ Files without a "pgen" sub-chunk are "Structurally Unsound." The inst sub-chunk is a multiple of 22 bytes. +### achInstName Changes + +- In SoundFont® 2.04, achInstName must be an ASCII string. +- Now, UTF-8 replaces ASCII, allowing more characters to be written. + ### This is a required sub-chunk Files without an "inst" sub-chunk are "Structurally Unsound." @@ -1050,6 +1114,11 @@ The shdr sub-chunk contains the headers for the sample data. It is a multiple of 46 bytes. +### achSampleName Changes + +- In SoundFont® 2.04, achSampleName must be an ASCII string. +- Now, UTF-8 replaces ASCII, allowing more characters to be written. + ### Sample Rate Limit Changes - In SFe, sample rates (dwSampleRate) are stored as a 32-bit integer. This is the same behavior as seen in the legacy SoundFont® 2.04 format. This results in a theoretical maximum sample rate of 4,294,967,295 Hz. @@ -1212,7 +1281,15 @@ This is the same as SoundFont® 2.04. ## 9.6 NRPN implementation -The NRPN implementation used by version 4.00 is identical to SoundFont® 2.04. +The NRPN implementation used by version 4.00 is identical to SoundFont® 2.04, but an update will be made in SFe version 4.01. + +## 9.7 On implementation accuracy + +E-mu was very lax when it came to accuracy of legacy SF implementations. This was because of the limitations of computers and legacy soundcards that the legacy SF spec and its implementations were initially designed to run on. While this was the only way that legacy SF could gain the popularity that it did with software implementations, this meant that bank developers often had to declare the program that their file was intended to be used with. This hampered interoperability with different SF players, including those that may have been embedded into musical instruments. + +Because today's computers are much faster, and legacy soundcards are no longer in widespread use, the requirements for implementation accuracy in SFe are far more strict. All SFe players are required to recognise the feature flags system that will be included in the ISFe subchunk starting from draft milestone version 4.00.10 and warn the user if there is a mismatch between feature flags in the bank and the program's support. + +While the feature flag system will be useful to alert users about incompatible programs, program developers should make an effort to ensure that their program is 100% compatible. # Section 10: Error-handling @@ -1335,7 +1412,9 @@ This glossary is broadly the same as the SF2.04 specification's glossary, with t - AWE64 - The successor to the famous AWE32, added things like waveguide synthesis. Use the EMU8000 synthesizer chip, like the preceding AWE32. Available in "Value" or "Gold" versions. -- BW64 - Broadcast Wave 64, used in the RF64 Header. +- Case-insensitive - Indicates that a UTF-8 character or string treats alphabetic characters of upper or lower case as identical. + +- Case-sensitive - Indicates that a UTF-8 character or string treats alphabetic characters of upper or lower case as distinct. - DAHDSR - Stands for Delay, attack, hold, decay, sustain, release. The six-step envelope system used in SF and SFe. diff --git a/sfe64-latest/format-specification/sfe-format-specification.md b/sfe64-latest/format-specification/sfe-format-specification.md index 7d306c0..e5d5039 100644 --- a/sfe64-latest/format-specification/sfe-format-specification.md +++ b/sfe64-latest/format-specification/sfe-format-specification.md @@ -1,10 +1,10 @@ # SF-enhanced 64-bit (SFe64) specification -## Version 4.00.8 (draft specification) +## Version 4.00.9a (draft specification) - November 2024 -Copyright 2020-2024 SFe Team +Copyright © 2020-2024 SFe Team and contributors -Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems Inc. +Based on the abandoned E-mu spec (Copyright © 1994–2002 E-mu Systems Inc.) * * * @@ -13,7 +13,8 @@ Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems In | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| 4.00.8a | October 30, 2024 | Started to fix SFe RIFF structure for 4.1-4.4
Now consistent with WernerSF3
Clarified versioning information | +| 4.00.9a | November 14, 2024 | Updated definitions of "case-insensitive" and "case-sensitive" to use UTF-8 instead of Ascii.
7.2, 7.6 and 7.10 now use UTF-8 instead of ascii.
Changed wPreset to use the ISFe bank for implementation in 4.04.
Because the preset library management system values are DWORDs, reworking them for 4.05.
Added license
Re-added 9.7 from SF2.04 with updated information about implementation accuracy
Clarified incompatibility of cognitone-formatted banks
Changed format extensions
Changed ISFe-list sub-chunk to a list
Added SFty sub-chunk in ISFe-list sub-chunk | +| 4.00.8 | October 30, 2024 | Started to fix SFe RIFF structure for 4.1-4.4
Now consistent with WernerSF3
Clarified versioning information | | 4.00.7c | October 17, 2024 | Fixed some more things
Name update | | 4.00.7b | October 12, 2024 | Updated program SFe32-to-SFe64 specification
Fix capitalisation in 1.5a
Remove extraneous table of contents entries
Fix more registered trademark symbols
| | 4.00.7a | October 10, 2024 | Table of contents added
Merge the pages into one
Fix the typos and formatting
Special thanks for spessasus for authoring these changes!
| @@ -71,6 +72,23 @@ Do not use "draft" specifications (version number x.yy.zL) to base final product * * * +## 0.2a License + +Copyright © 2020-2024 SFe Team and contributors + +Permission is granted to use, distribute and modify this draft specification for any use, provided that: + +- this specification is clearly marked as a draft +- you attribute the SFe Team (do not remove copyright notices) +- you clearly mark any modifications that are made to the specification +- you share all modifications implemented in a program under this license +- you do not remove the link to the latest version of the specification +- you do not claim that we're affiliated with E-mu or Creative Labs. + +This specification is provided "as-is" without any warranty. + +* * * + ## 0.3 Updates and comments The website "soundfont.com" is dead (last archive.org snapshot we could found was 2012/13), and the provided email on the SF 2.04 spec probably doesn't work, so contact the SFe Team: @@ -102,6 +120,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [0.1 Revision history](#01-revision-history) * [0.1a Specification Versioning](#01a-specification-versioning) * [0.2 Disclaimers](#02-disclaimers) + * [0.2a License](#02a-license) * [0.3 Updates and comments](#03-updates-and-comments) * [0.3a SFe Team](#03a-sfe-team) * [0.4 Table of contents](#04-table-of-contents) @@ -140,6 +159,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [5.10 "ICMT" subchunk](#510-icmt-subchunk) * [5.11 "ISFT" subchunk](#511-isft-subchunk) * [5.12 "ISFe" subchunk](#512-isfe-subchunk) + * [5.12.1 "SFty" sub-chunk](#5121-sfty-sub-chunk) * [Section 6: "sdta-list" chunk](#section-6-sdta-list-chunk) * [6.1a "smpl" sub-chunk](#61a-smpl-sub-chunk) * [6.1b About compression in SFe64](#61b-about-compression-in-sfe64) @@ -149,6 +169,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [Section 7: "pdta-list" chunk](#section-7-pdta-list-chunk) * [7.1 "Hydra" structure](#71-hydra-structure) * [7.2 "phdr" sub-chunk](#72-phdr-sub-chunk) + * [achPresetName Changes](#achpresetname-changes) * [wPreset Changes](#wpreset-changes) * [wBank Changes](#wbank-changes) * [Definitions of dwLibrary and dwGenre](#definitions-of-dwlibrary-and-dwgenre) @@ -159,6 +180,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [7.5 "pgen" sub-chunk](#75-pgen-sub-chunk) * [New options for the SFGenerator enum](#new-options-for-the-sfgenerator-enum) * [7.6 "inst" sub-chunk](#76-inst-sub-chunk) + * [achInstName Changes](#achinstname-changes) * [7.7 "ibag" sub-chunk](#77-ibag-sub-chunk) * [7.8 "imod" sub-chunk](#78-imod-sub-chunk) * [New options for the SFModulator enum](#new-options-for-the-sfmodulator-enum-1) @@ -166,6 +188,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [7.9 "igen" sub-chunk](#79-igen-sub-chunk) * [New options for the SFGenerator enum](#new-options-for-the-sfgenerator-enum-1) * [7.10 "shdr" sub-chunk](#710-shdr-sub-chunk) + * [achSampleName Changes](#achsamplename-changes) * [Sample Rate Limit Changes](#sample-rate-limit-changes) * [sfSampleType and Werner SF3](#sfsampletype-and-werner-sf3) * [Section 8: Enumerators](#section-8-enumerators) @@ -193,6 +216,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [9.4 SF Generator Model](#94-sf-generator-model) * [9.5 SF Modulator Model](#95-sf-modulator-model) * [9.6 NRPN implementation](#96-nrpn-implementation) + * [9.7 On implementation accuracy](#97-on-implementation-accuracy) * [Section 10: Error-handling](#section-10-error-handling) * [10.1 Structural errors](#101-structural-errors) * [10.1a Duplicated preset locations within files](#101a-duplicated-preset-locations-within-files) @@ -342,8 +366,7 @@ We decided to do a feature freeze for version 4.00 to make sure that SFe program Here are a few things that are planned for SFe: -- An SDK to assist SFe program developers with creating programs for the new format will be available with the version 4.00 final specification. - - The first part of this SDK including an implementation of SFe will release in 4.00.9. +- For version 4.00.10, we're going to introduce the feature flags system, a method of determining whether certain features are supported by a player. - For version 4.01, there will be an overhaul of the default modulators system, inspired by the [DMOD proposal by spessasus](https://github.com/davy7125/polyphone/issues/205). - A MIDI lyrics specification for MIDI players will become available in version 4.02. - We will negotiate with the Synthfont author Kenneth Rundt about getting the Synthfont Custom Features added for version 4.03. @@ -396,7 +419,13 @@ The synth terminology used in SFe64 version 4.00 is broadly the same as the E-mu These changes: - Articulation - Modulation of available parameters and usage of extra samples to produce expressive musical notes. + +- Case-insensitive - Indicates that a UTF-8 character or string treats alphabetic characters of upper or lower case as identical. + +- Case-sensitive - Indicates that a UTF-8 character or string treats alphabetic characters of upper or lower case as distinct. + - Downloadable - SF version 2, 3 or SFe file obtained from the internet. (Old meaning referred to the obsolete ROM system) + - MIDI Bank - Groups of up to 128 presets, which can be selected by the two MIDI "Bank Select" control changes (CC00 and CC32). And these removals: @@ -479,131 +508,136 @@ RF64('sfbk' ds64(dataSize) LIST('INFO' { - ifil( - struct sfVersionTag - { - WORD wMajor; - WORD wMinor; - } - ); - isng(szSoundEngine:ZSTR); - irom(szROM:ZSTR); - iver( - struct sfVersionTag - { - WORD wMajor; - WORD wMinor; - } - ); - ICRD(szDate:ZSTR); - IENG(szName:ZSTR); - IPRD(szProduct:ZSTR); - ICOP(szCopyright:ZSTR); - ICMT(szComment:ZSTR); - ISFT(szTools:ZSTR); - ISFe( - struct sfeSubchunk - { - // Not defined for 4.00.8 - } - ); + ifil( + struct sfVersionTag + { + WORD wMajor; + WORD wMinor; + } + ); + isng(szSoundEngine:ZSTR); + irom(szROM:ZSTR); + iver( + struct sfVersionTag + { + WORD wMajor; + WORD wMinor; + } + ); + ICRD(szDate:ZSTR); + IENG(szName:ZSTR); + IPRD(szProduct:ZSTR); + ICOP(szCopyright:ZSTR); + ICMT(szComment:ZSTR); + ISFT(szTools:ZSTR); + LIST('ISFe' + { + SFty(szSFeType:ZSTR); + flag( + // Not defined until 4.00.10 + ); + prsw( + // Not defined until 4.05 + ); + } + ); } ) LIST('sdta' { - smpl(); + smpl(); } { - sm24(); + sm24(); } { - sm32(); + sm32(); } ) LIST('pdta' { phdr( struct sfPresetHeader - { - CHAR achPresetName[20]; - WORD wPreset; - WORD wBank; - WORD wPresetBagNdx; - DWORD dwLibrary; - DWORD dwGenre; - DWORD dwMorphology; - } - ); - pbag( - struct sfPresetBag - { - WORD wGenNdx; - WORD wModNdx; - } - ); - pmod( - struct sfModList - { - SFModulator sfModSrcOper; - SFGenerator sfModDestOper; - SHORT modAmount; - SFModulator sfModAmtSrcOper; - SFTransform sfModTransOper; - } - ); - pgen( - struct sfGenList - { - SFGenerator sfGenOper; - genAmountType genAmount; - } - ); - inst( - struct sfInst - { - CHAR achInstName[20]; - WORD wInstBagNdx; - } - ); - ibag( - struct sfInstBag - { - WORD wInstGenNdx; - WORD wInstModNdx; - } - ); - imod( - struct sfInstModList - { - SFModulator sfModSrcOper; - SFGenerator sfModDestOper; - SHORT modAmount; - SFModulator sfModAmtSrcOper; - SFTransform sfModTransOper; - } - ); - igen( - struct sfInstGenList - { - SFGenerator sfGenOper; - genAmountType genAmount; - } - ); - shdr( - struct sfSample - { - CHAR achSampleName[20]; - DWORD dwStart; - DWORD dwEnd; - DWORD dwStartloop; - DWORD dwEndloop; - DWORD dwSampleRate; - BYTE byOriginalKey; - CHAR chCorrection; - WORD wSampleLink; - SFSampleLink sfSampleType; - } - ); + { + CHAR achPresetName[20]; + WORD wPreset; + WORD wBank; + WORD wPresetBagNdx; + DWORD dwLibrary; + DWORD dwGenre; + DWORD dwMorphology; + } + ); + pbag( + struct sfPresetBag + { + WORD wGenNdx; + WORD wModNdx; + } + ); + pmod( + struct sfModList + { + SFModulator sfModSrcOper; + SFGenerator sfModDestOper; + SHORT modAmount; + SFModulator sfModAmtSrcOper; + SFTransform sfModTransOper; + } + ); + pgen( + struct sfGenList + { + SFGenerator sfGenOper; + genAmountType genAmount; + } + ); + inst( + struct sfInst + { + CHAR achInstName[20]; + WORD wInstBagNdx; + } + ); + ibag( + struct sfInstBag + { + WORD wInstGenNdx; + WORD wInstModNdx; + } + ); + imod( + struct sfInstModList + { + SFModulator sfModSrcOper; + SFGenerator sfModDestOper; + SHORT modAmount; + SFModulator sfModAmtSrcOper; + SFTransform sfModTransOper; + } + ); + igen( + struct sfInstGenList + { + SFGenerator sfGenOper; + genAmountType genAmount; + } + ); + shdr( + struct sfSample + { + CHAR achSampleName[20]; + DWORD dwStart; + DWORD dwEnd; + DWORD dwStartloop; + DWORD dwEndloop; + DWORD dwSampleRate; + BYTE byOriginalKey; + CHAR chCorrection; + WORD wSampleLink; + SFSampleLink sfSampleType; + } + ); } ) } @@ -620,7 +654,9 @@ The type definitions are identical to those used in SoundFont® version 2.04. ## 4.5a File format extensions -SFe64 files may use the extension .SFE64 to prevent playback in legacy SF players that do not support SFe64. +The file format extension to use for SFe files is generally `.sft`, including all SFe64 files. `.sf4` is avoided due to incompatibility with cognitone formatted banks. + +When opening a bank with extension `.sft`, programs must determine the correct version to use. # Section 5: "info-list" chunk @@ -770,7 +806,31 @@ Reject anything not terminated with a zero byte. Do NOT reject the file as "Stru ## 5.12 "ISFe" subchunk -This would contain additional metadata for SFe specific features. Currently, in version 4.00, this is empty. + +The `ISFe-list` sub-chunk includes many different sub-chunks to show information about SFe-specific features. Generally, we use the `ISFe-list` sub-chunk to make it clearer that this kind of information is SFe-specific. + +Due to compatibility constraints, the `ISFe-list` sub-chunk is found inside the `INFO-list` subchunk, rather than as a fourth RIFF chunk. Legacy SF players may not support more than three main RIFF chunks. If we can't use list sub-chunks inside other chunks, then instead of an SFe sub-chunk, the sub-chunks defined here will just be part of the `INFO-list` subchunk until SFe64 5.x is released, which will include a fourth separate `ISFe-list` chunk. + +### 5.12.1 "SFty" sub-chunk + +The `SFty` sub-chunk is an optional sub-chunk identifying the variant of SFe the bank is formatted in. It contains a UTF-8 string of 256 or fewer bytes including one or two terminators of value zero to make the total byte count even. + +The `SFty` string is used by SFe-compatible players to assist in loading banks by telling the program what variant of SFe to load a bank as. + +The defined values of the `SFty` chunk are: + +- the 6 bytes representing `SFe32` as 5 UTF-8 characters followed by one zero byte. +- the 8 bytes representing `SFe32L` as 6 UTF-8 characters followed by two zero bytes. +- the 16 bytes representing `SFe32 with TSC` as 14 UTF-8 characters followed by two zero bytes. +- the 16 bytes representing `SFe32L with TSC` as 15 UTF-8 characters followed by one zero byte. +- the 6 bytes representing `SFe64` as 5 UTF-8 characters followed by one zero bytes. +- the 8 bytes representing `SFe64L` as 6 UTF-8 characters followed by two zero bytes. + +The field should conventionally never be longer than 16 bytes. + +The UTF-8 should be treated as case-sensitive. In other words, `sfe32 with tsc` is not the same as `SFe32 with TSC`. + +If the SFty sub-chunk is missing, not terminated in a zero-valued byte, or its contents are an undefined value, other properties of the structure should be used to determine the variant of SFe that is in use. Do not assume `SFe64`; only use such a value when it is evident beyond a reasonable doubt that the file used is SFe64. * * * @@ -804,6 +864,7 @@ To implement compression in your SFe64 bank, please use [Werner SF3](https://git - The "scom" sub-chunk found in specification versions 4.00.3 and earlier is now obsolete. - Incompatible SF compression formats (.sfark, .sfpack, .sf2pack, .sfq) are prohibited. You should use Werner SF3. - When Werner SF3 is in use, the size of smpl is not required to be a multiple of two, and the surrounding LIST chunk isn't padded to a multiple of two. +- Because cognitone-formatted banks are not valid Werner SF3 banks, they are considered an incompatible SF compression format, and are therefore not allowed. * * * @@ -872,29 +933,28 @@ The size of this chunk is a multiple of 38 bytes. Its structure is the same as in SF2.04. +### achPresetName Changes + +- In SoundFont® 2.04, achPresetName must be an ASCII string. +- Now, UTF-8 replaces ASCII, allowing more characters to be written. + ### wPreset Changes - In SoundFont® 2.04, bits 2–8 were used to select up to 128 instruments. Bits 1 and 9–16 were unused. -- Now, bits 10–16 can be used to select alternate banks. +- Now, bits 10–16 can be used to select alternate banks using the ISFe subchunk. - It's designed to be used with sysex or other commands corresponding to General MIDI extension resets. - What bits 9–16 do in version 4: - Bit 9 remains reserved. - - General MIDI™ one or two reset clears bits 10 and 11. - - Roland® GS® reset clears bit 10 and sets bit 11. - - Yamaha® XG® reset sets bit 10 and clears bit 11. - - Roland® CM-64™/CM-32L™ reset sets bits 10 and 11. - - Bit 12 is reserved for more MIDI commands in the future. For now, bit 12 should be written as clear. - - Bits 13–16 will not be defined. The author of the SF may use these at will with their own MIDI commands. - - MIDI sequencers will eventually be able to set or clear all bits from 10 to 16 using commands. + - Bits 10-16 are reserved for MIDI commands as defined in the ISFe subchunk. For now, these bits should be written as clear. - It allows you to run multiple standards that may conflict with each other. ### wBank Changes -- Version 4.00.1 had a new field called wBank2. -- Now, wBank stores both m.s.b. and l.s.b. bank changes (CC00 and CC32), eliminating the need for wBank2. +- Version 4.00.1 had a field called wBank2. Any draft with wBank2 is now obsolete. +- Starting from 4.00.2, wBank stores both m.s.b. and l.s.b. bank changes (CC00 and CC32), eliminating the need for wBank2. - wBank is still a WORD. This change was possible as wBank is 16-bit, which is sufficient to store the 14-bit bank change space. We commend E-mu for being forward enough thinking to not use a CHAR/BYTE for bank selection. -- In SoundFont® 2.04, and SFe version 4.00.1, bit 1 was only used with bank 128 (for percussion), and bits 2–8 were used to select a single bank between 0 and 127. Bits 9–16 were unused. -- wBank is little endian. +- In SoundFont® 2.04 and 4.00.1, bit 1 was only used with bank 128 (for percussion), and bits 2–8 were used to select a single bank between 0 and 127. Bits 9–16 were unused. +- wBank, like other SFe values (for the most part?), is little endian. - Now, bit 9 is also a percussion toggle. If a bank/program change combination produces a different result for midi channel 10, bit 1 controls the percussion. - File editors should warn the user if this issue is found. - Bits 2–8 are now used to set the first bank change, and bits 10–16 are now used to set the second bank change. @@ -911,9 +971,9 @@ Its structure is the same as in SF2.04. Old 2.04 fields "dwLibrary" and "dwGenre" are now defined. - "dwLibrary" is for the overall name of the set of files contained in a library of SFe, version 4 files. - - For example, "SFe Collection!" (with appropriate zero bytes) + - This value will correspond to a list in an enum. This is planned for 4.05. - "dwGenre" is for the genre of music which the files are optimized for. - - For example, "Rock" (with appropriate zero bytes) + - This value will correspond to a list in an enum. This is planned for 4.05. - "dwMorphology" has been left out of this draft specification. It will eventually be re-introduced in a future version. ### Do not access the final sfPresetHeader entry @@ -984,6 +1044,11 @@ Files without a "pgen" sub-chunk are "Structurally Unsound." The inst sub-chunk is a multiple of 22 bytes. +### achInstName Changes + +- In SoundFont® 2.04, achInstName must be an ASCII string. +- Now, UTF-8 replaces ASCII, allowing more characters to be written. + ### This is a required sub-chunk Files without an "inst" sub-chunk are "Structurally Unsound." @@ -1052,6 +1117,11 @@ The shdr sub-chunk contains the headers for the sample data. It is a multiple of 46 bytes. +### achSampleName Changes + +- In SoundFont® 2.04, achSampleName must be an ASCII string. +- Now, UTF-8 replaces ASCII, allowing more characters to be written. + ### Sample Rate Limit Changes - In SFe, sample rates (dwSampleRate) are stored as a 32-bit integer. This is the same behavior as seen in the legacy SoundFont® 2.04 format. This results in a theoretical maximum sample rate of 4,294,967,295 Hz. @@ -1216,6 +1286,16 @@ This is the same as SoundFont® 2.04. The NRPN implementation used by version 4.00 is identical to SoundFont® 2.04. +* * * + +## 9.7 On implementation accuracy + +E-mu was very lax when it came to accuracy of legacy SF implementations. This was because of the limitations of computers and legacy soundcards that the legacy SF spec and its implementations were initially designed to run on. While this was the only way that legacy SF could gain the popularity that it did with software implementations, this meant that bank developers often had to declare the program that their file was intended to be used with. This hampered interoperability with different SF players, including those that may have been embedded into musical instruments. + +Because today's computers are much faster, and legacy soundcards are no longer in widespread use, the requirements for implementation accuracy in SFe are far more strict. All SFe players are required to recognise the feature flags system that will be included in the ISFe subchunk starting from draft milestone version 4.00.10 and warn the user if there is a mismatch between feature flags in the bank and the program's support. + +While the feature flag system will be useful to alert users about incompatible programs, program developers should make an effort to ensure that their program is 100% compatible. + # Section 10: Error-handling ## 10.1 Structural errors @@ -1345,6 +1425,10 @@ This glossary is broadly the same as the SF2.04 specification's glossary, with t - BW64 - Broadcast Wave 64, used in the RF64 Header. +- Case-insensitive - Indicates that a UTF-8 character or string treats alphabetic characters of upper or lower case as identical. + +- Case-sensitive - Indicates that a UTF-8 character or string treats alphabetic characters of upper or lower case as distinct. + - DAHDSR - Stands for Delay, attack, hold, decay, sustain, release. The six-step envelope system used in SF and SFe. - Downloadable - SF version 2, 3 or SFe file obtained from the internet. (Old meaning referred to the obsolete ROM system)