From a0625b079c13801c87603d00855ffbcc37c4894f Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Fri, 8 Nov 2024 14:56:55 +0000 Subject: [PATCH 1/9] Changed versioning rules in 5.1a --- .../sfe-format-specification.md | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index 79a869e..c4ee63b 100644 --- a/sfe32-latest/format-specification/sfe-format-specification.md +++ b/sfe32-latest/format-specification/sfe-format-specification.md @@ -13,6 +13,7 @@ Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems In | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | +| This version | November 8, 2024 | Changed versioning rules in 5.1a to make it easier for programs to detect version numbers. | | 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.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
| @@ -624,22 +625,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 +652,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 +670,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. From 9a782db475e12bd287becb6db9c5ebb401ae382a Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Fri, 8 Nov 2024 14:57:34 +0000 Subject: [PATCH 2/9] Oops! Forget to change version number! --- sfe32-latest/format-specification/sfe-format-specification.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index c4ee63b..7fb9a2f 100644 --- a/sfe32-latest/format-specification/sfe-format-specification.md +++ b/sfe32-latest/format-specification/sfe-format-specification.md @@ -1,6 +1,6 @@ # SF-enhanced 32-bit (SFe32) specification -## Version 4.00.8 (draft specification) +## Version 4.00.20241108a (draft specification) Copyright 2020-2024 SFe Team From 9acd1fbed32674c62ac34ac84d0dfaa9752a851b Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Fri, 8 Nov 2024 16:10:11 +0000 Subject: [PATCH 3/9] Finished removing Ascii --- .../sfe-format-specification.md | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index 7fb9a2f..a4d4449 100644 --- a/sfe32-latest/format-specification/sfe-format-specification.md +++ b/sfe32-latest/format-specification/sfe-format-specification.md @@ -1,6 +1,6 @@ # SF-enhanced 32-bit (SFe32) specification -## Version 4.00.20241108a (draft specification) +## Version 4.00.20241108b (draft specification) Copyright 2020-2024 SFe Team @@ -13,7 +13,7 @@ Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems In | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | November 8, 2024 | Changed versioning rules in 5.1a to make it easier for programs to detect version numbers. | +| This version | November 8, 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. | | 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.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
| @@ -150,6 +150,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) @@ -160,6 +161,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) @@ -167,6 +169,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) @@ -393,7 +396,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: @@ -874,7 +883,12 @@ 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 @@ -988,6 +1002,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." @@ -1056,6 +1075,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. From 624cffdba267403f54fb1b03778bb259e6240f41 Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Sat, 9 Nov 2024 04:59:53 +0000 Subject: [PATCH 4/9] Almost final version of 4.00.9 spec and SFe logos --- sfe-logos/SFe32-colour.png | Bin 0 -> 6630 bytes sfe-logos/SFe32.png | Bin 0 -> 8606 bytes sfe-logos/SFe64-colour.png | Bin 0 -> 6595 bytes sfe-logos/SFe64.png | Bin 0 -> 8564 bytes sfe-logos/SFe64L-colour.png | Bin 0 -> 5230 bytes sfe-logos/SFe64L.png | Bin 0 -> 8595 bytes .../sfe-format-specification.md | 34 +++++------ .../sfe-format-specification.md | 53 +++++++++++++----- 8 files changed, 53 insertions(+), 34 deletions(-) create mode 100644 sfe-logos/SFe32-colour.png create mode 100644 sfe-logos/SFe32.png create mode 100644 sfe-logos/SFe64-colour.png create mode 100644 sfe-logos/SFe64.png create mode 100644 sfe-logos/SFe64L-colour.png create mode 100644 sfe-logos/SFe64L.png diff --git a/sfe-logos/SFe32-colour.png b/sfe-logos/SFe32-colour.png new file mode 100644 index 0000000000000000000000000000000000000000..687d944f34df0db6b1c55ad2b0f81c21dec0be7b GIT binary patch literal 6630 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 literal 0 HcmV?d00001 diff --git a/sfe-logos/SFe32.png b/sfe-logos/SFe32.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa74cdfcad5440b893a7af0ea8ebd96cb1ca918 GIT binary patch literal 8606 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≪E^CSjZ2T7a2EbRwt=vL1z~vGF)FXkXiZIPYuw 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 z
  • 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 A)Bpeg literal 0 HcmV?d00001 diff --git a/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index a4d4449..de1c822 100644 --- a/sfe32-latest/format-specification/sfe-format-specification.md +++ b/sfe32-latest/format-specification/sfe-format-specification.md @@ -1,6 +1,6 @@ # SF-enhanced 32-bit (SFe32) specification -## Version 4.00.20241108b (draft specification) +## Version 4.00.20241109a (draft specification) Copyright 2020-2024 SFe Team @@ -13,7 +13,7 @@ Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems In | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | November 8, 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. | +| This version | November 9, 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. | | 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.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
    | @@ -330,7 +330,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. @@ -505,7 +505,7 @@ RIFF('sfbk' ISFe( struct sfeSubchunk { - // Not defined for 4.00.8, implementation due for 4.00.10 + // Not defined for 4.00.9, implementation due for 4.00.10 } ); } @@ -893,26 +893,20 @@ Its structure is the same as in SF2.04. ### 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. @@ -929,9 +923,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 @@ -1365,7 +1359,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..b95d719 100644 --- a/sfe64-latest/format-specification/sfe-format-specification.md +++ b/sfe64-latest/format-specification/sfe-format-specification.md @@ -1,6 +1,6 @@ # SF-enhanced 64-bit (SFe64) specification -## Version 4.00.8 (draft specification) +## Version 4.00.20241109a (draft specification) Copyright 2020-2024 SFe Team @@ -13,6 +13,7 @@ Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems In | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | +| This version | November 9, 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. | | 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.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
    | @@ -149,6 +150,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 +161,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 +169,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) @@ -396,7 +400,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: @@ -872,29 +882,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 +920,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 +993,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 +1066,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. @@ -1345,6 +1364,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) From 895cb0535d9c5f82b2114efffb6680dfba6125a9 Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Sat, 9 Nov 2024 16:40:49 +0000 Subject: [PATCH 5/9] Added license and information on implementation accuracy --- LICENSE.md | 12 ++++++ .../sfe-format-specification.md | 35 +++++++++++++++--- .../sfe-format-specification.md | 37 +++++++++++++++++-- 3 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 LICENSE.md 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/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index de1c822..de1e6e6 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.20241109a (draft specification) +## Version 4.00.20241109b (draft specification) -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,7 @@ Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems In | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | November 9, 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. | +| This version | November 9, 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 | | 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.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
    | @@ -70,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 @@ -103,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) @@ -197,6 +213,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) @@ -1236,7 +1253,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 diff --git a/sfe64-latest/format-specification/sfe-format-specification.md b/sfe64-latest/format-specification/sfe-format-specification.md index b95d719..87b1263 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.20241109a (draft specification) +## Version 4.00.20241109b (draft specification) -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,7 @@ Based on the abandoned E-mu spec, which is copyright 1994–2002 E-mu Systems In | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | November 9, 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. | +| This version | November 9, 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 | | 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.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
    | @@ -72,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: @@ -103,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) @@ -197,6 +215,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) @@ -1235,6 +1254,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 From 46273e993a8fc8ce3cba13d9c1ab223c37ab659f Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:30:26 +0000 Subject: [PATCH 6/9] Almost-final version of 4.00.9 Awaiting SFe version sub-chunk in ISFe chunk --- LICENSE-FINAL.md | 11 ++++++++++ .../sfe-format-specification.md | 21 +++++++++++-------- .../sfe-format-specification.md | 14 +++++++------ 3 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 LICENSE-FINAL.md 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/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index de1e6e6..7712aaa 100644 --- a/sfe32-latest/format-specification/sfe-format-specification.md +++ b/sfe32-latest/format-specification/sfe-format-specification.md @@ -1,6 +1,6 @@ # SF-enhanced 32-bit (SFe32) specification -## Version 4.00.20241109b (draft specification) +## Version 4.00.20241114a (draft specification) Copyright © 2020-2024 SFe Team and contributors @@ -13,8 +13,8 @@ Based on the abandoned E-mu spec (Copyright © 1994–2002 E-mu Systems Inc.) | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | November 9, 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 | -| 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 | +| This version | 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) | +| 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!
    | @@ -168,7 +168,7 @@ Want to join the SFe Team? Please contact sylvia-leaf using the contacts in sect * [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) @@ -283,7 +283,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. * * * @@ -363,8 +363,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. @@ -638,7 +637,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 @@ -832,6 +833,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. * * * @@ -917,7 +920,7 @@ Its structure is the same as in SF2.04. - 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 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. diff --git a/sfe64-latest/format-specification/sfe-format-specification.md b/sfe64-latest/format-specification/sfe-format-specification.md index 87b1263..5cda9c5 100644 --- a/sfe64-latest/format-specification/sfe-format-specification.md +++ b/sfe64-latest/format-specification/sfe-format-specification.md @@ -1,6 +1,6 @@ # SF-enhanced 64-bit (SFe64) specification -## Version 4.00.20241109b (draft specification) +## Version 4.00.20241114a (draft specification) Copyright © 2020-2024 SFe Team and contributors @@ -13,8 +13,8 @@ Based on the abandoned E-mu spec (Copyright © 1994–2002 E-mu Systems Inc.) | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | November 9, 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 | -| 4.00.8a | October 30, 2024 | Started to fix SFe RIFF structure for 4.1-4.4
    Now consistent with WernerSF3
    Clarified versioning information | +| This version | 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 | +| 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!
    | @@ -365,8 +365,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. @@ -649,7 +648,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 @@ -833,6 +834,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. * * * From 819594e91af4b7cbf9d15ba0e4474cba8eaf6028 Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:14:50 +0000 Subject: [PATCH 7/9] Version 4.00.9 finished! --- .../sfe-format-specification.md | 261 ++++++++++-------- .../sfe-format-specification.md | 258 +++++++++-------- 2 files changed, 288 insertions(+), 231 deletions(-) diff --git a/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index 7712aaa..75377e8 100644 --- a/sfe32-latest/format-specification/sfe-format-specification.md +++ b/sfe32-latest/format-specification/sfe-format-specification.md @@ -1,6 +1,6 @@ # SF-enhanced 32-bit (SFe32) specification -## Version 4.00.20241114a (draft specification) +## Version 4.00.9a (draft specification) - November 2024 Copyright © 2020-2024 SFe Team and contributors @@ -13,7 +13,7 @@ Based on the abandoned E-mu spec (Copyright © 1994–2002 E-mu Systems Inc.) | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | 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) | +| 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
    | @@ -157,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) @@ -496,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.9, 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; + } + ); } ) } @@ -798,9 +804,30 @@ 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. -The first ISFe subchunk feature, the feature flags system, is planned for milestone 4.00.10. +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 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 `SFe32`; only use such a value when it is evident beyond a reasonable doubt that the file used is SFe32. * * * diff --git a/sfe64-latest/format-specification/sfe-format-specification.md b/sfe64-latest/format-specification/sfe-format-specification.md index 5cda9c5..301f4b8 100644 --- a/sfe64-latest/format-specification/sfe-format-specification.md +++ b/sfe64-latest/format-specification/sfe-format-specification.md @@ -1,6 +1,6 @@ # SF-enhanced 64-bit (SFe64) specification -## Version 4.00.20241114a (draft specification) +## Version 4.00.9a (draft specification) - November 2024 Copyright © 2020-2024 SFe Team and contributors @@ -13,7 +13,7 @@ Based on the abandoned E-mu spec (Copyright © 1994–2002 E-mu Systems Inc.) | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | 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 | +| This version | 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
    | @@ -159,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) @@ -507,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; + } + ); } ) } @@ -800,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. * * * From b62e891462fa8874c9a8cc23d77c0e85eb8a3e0d Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:16:57 +0000 Subject: [PATCH 8/9] Remove reference to SFe64 before SFe32 4.00.9 release --- sfe32-latest/format-specification/sfe-format-specification.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/sfe32-latest/format-specification/sfe-format-specification.md b/sfe32-latest/format-specification/sfe-format-specification.md index 75377e8..d7f3878 100644 --- a/sfe32-latest/format-specification/sfe-format-specification.md +++ b/sfe32-latest/format-specification/sfe-format-specification.md @@ -820,8 +820,6 @@ The defined values of the `SFty` chunk are: - 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. From 17f33ae1487a27f392ade8571401f36b68c5afd7 Mon Sep 17 00:00:00 2001 From: sylvia-leaf <33123585+sylvia-leaf@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:21:38 +0000 Subject: [PATCH 9/9] Forgot to update the table completely --- sfe64-latest/format-specification/sfe-format-specification.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sfe64-latest/format-specification/sfe-format-specification.md b/sfe64-latest/format-specification/sfe-format-specification.md index 301f4b8..e5d5039 100644 --- a/sfe64-latest/format-specification/sfe-format-specification.md +++ b/sfe64-latest/format-specification/sfe-format-specification.md @@ -13,7 +13,7 @@ Based on the abandoned E-mu spec (Copyright © 1994–2002 E-mu Systems Inc.) | | | | |---------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Revision | Date | Description | -| This version | 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.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
    |