{"id":41349435,"url":"https://github.com/spessasus/sf2-rmidi-specification","last_synced_at":"2026-01-23T07:16:20.190Z","repository":{"id":252224596,"uuid":"839804222","full_name":"spessasus/sf2-rmidi-specification","owner":"spessasus","description":"SF2 RMIDI Format Specification","archived":false,"fork":false,"pushed_at":"2025-08-17T20:30:07.000Z","size":14868,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-17T22:19:26.257Z","etag":null,"topics":["midi","midi-files","rmid","rmidi","sf2","sf3","soundfont","spec","specification"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spessasus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-08T11:04:02.000Z","updated_at":"2025-08-17T20:30:10.000Z","dependencies_parsed_at":"2025-08-17T22:11:16.276Z","dependency_job_id":null,"html_url":"https://github.com/spessasus/sf2-rmidi-specification","commit_stats":null,"previous_names":["spessasus/sf2-rmidi-specification"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/spessasus/sf2-rmidi-specification","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spessasus%2Fsf2-rmidi-specification","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spessasus%2Fsf2-rmidi-specification/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spessasus%2Fsf2-rmidi-specification/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spessasus%2Fsf2-rmidi-specification/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spessasus","download_url":"https://codeload.github.com/spessasus/sf2-rmidi-specification/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spessasus%2Fsf2-rmidi-specification/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28682738,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T05:48:07.525Z","status":"ssl_error","status_checked_at":"2026-01-23T05:48:07.129Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["midi","midi-files","rmid","rmidi","sf2","sf3","soundfont","spec","specification"],"created_at":"2026-01-23T07:16:19.477Z","updated_at":"2026-01-23T07:16:20.184Z","avatar_url":"https://github.com/spessasus.png","language":null,"funding_links":[],"categories":["Others"],"sub_categories":[],"readme":"# SF2 RMIDI Format Extension Specification\nOriginal format was created by Microsoft and later expanded by the MIDI Manufacturers Association.\n\nOriginal format expansion idea by Zoltán Bacskó of [Falcosoft](https://falcosoft.hu), later expanded by spessasus.\nSpecification written by spessasus with the help of Zoltán.\n\nRevision 1.22\n## Preamble\n\n\u003cp align=\"justify\"\u003e\nMIDI files have long-faced a significant challenge: \u003cstrong\u003edifferent sounds on different devices.\u003c/strong\u003e\nSF2 + MIDI combinations address this issue partially\nby ensuring that playing both files through an SF2-compliant synth results in the same sound being produced. \nThe RMIDI format is not new; it was originally developed by Microsoft as a RIFF wrapper for MIDI files\nand later expanded by the MIDI Manufacturers Association to support embedding DLS sound banks.\nHowever, DLS is not widely used today, whereas the SoundFont2 (SF2) format serves a similar purpose and remains quite popular.\nThe SF2 RMIDI format integrates MIDI and SF2 files into a single file, augmented with additional metadata. \nThis document serves as a specification for this format extension.\nThis version of RMIDI was created by Zoltán Bacskó of \u003ca href=\"https://falcosoft.hu\"\u003eFalcosoft\u003c/a\u003e\nand implemented in \u003ca href=\"https://falcosoft.hu/softwares.html#midiplayer\"\u003eFalcosoft SoundFont Midi Player 6.\u003c/a\u003e \nI am in contact with Zoltán,\nwho \u003ca href=\"https://www.vogons.org/viewtopic.php?p=1282710#p1282710\"\u003egranted permission\u003c/a\u003e for me to write this specification. \n\nIf you find any part of this specification unclear, please reach out via \u003ca href=\"https://www.vogons.org/viewtopic.php?p=1281224\"\u003ethis thread\u003c/a\u003e or file a \u003ca href=\"https://github.com/spessasus/sf2-rmidi-specification/issues/new\"\u003eGitHub issue\u003c/a\u003e in this repository.\nAlso feel free to report any issues such as typos or expansions!\n\u003c/p\u003e\n\n## Design Goals\nThis extension has been designed with the following goals in mind:\n- legacy compatibility with the original RMIDI format\n- easy adaptation for existing software\n- support for modern SoundFont2 files\n- expanded metadata support\n\n## Table of Contents\n\u003c!-- TOC --\u003e\n* [SF2 RMIDI Format Extension Specification](#sf2-rmidi-format-extension-specification)\n  * [Preamble](#preamble)\n  * [Design Goals](#design-goals)\n  * [Table of Contents](#table-of-contents)\n  * [Terminology](#terminology)\n  * [Extension](#extension)\n  * [RIFF Chunk](#riff-chunk)\n    * [Example chunk](#example-chunk)\n* [SF2 RMIDI File Specification](#sf2-rmidi-file-specification)\n  * [File Structure](#file-structure)\n    * [Example file](#example-file)\n    * [Handling Differences](#handling-differences)\n  * [INFO Chunk](#info-chunk)\n    * [Metadata Chunks](#metadata-chunks)\n    * [Chunk Rules](#chunk-rules)\n      * [IENC Chunk Requirements](#ienc-chunk-requirements)\n      * [IPIC Chunk Requirements](#ipic-chunk-requirements)\n      * [DBNK Chunk](#dbnk-chunk)\n  * [Embedded sound bank](#embedded-sound-bank)\n    * [Bank Offset](#bank-offset)\n  * [Player pseudo code](#player-pseudo-code)\n  * [Software Requirements](#software-requirements)\n    * [Level 1](#level-1)\n    * [Level 2](#level-2)\n    * [Level 3](#level-3)\n    * [Level 4](#level-4)\n  * [Types of RMIDI Files](#types-of-rmidi-files)\n    * [Self-Contained File](#self-contained-file)\n    * [External File](#external-file)\n  * [Recommendations for Writing RMIDI Files](#recommendations-for-writing-rmidi-files)\n  * [Example Files](#example-files)\n  * [Reference Implementation](#reference-implementation)\n  * [Legal Notice](#legal-notice)\n\u003c!-- TOC --\u003e\n\n## Terminology\nThis specification assumes familiarity with the SoundFont2 format and the Standard MIDI File (SMF) format. \nAdditional terminology used in this specification includes:\n\n- **The software**: Refers to software compliant with this specification.\n- **Bit**: The most basic data structure element, either 0 or 1.\n- **Byte**: A data structure element of eight bits, with no defined meaning to those bits.\n- **SoundFont**: A [SoundFont2](https://musescore.org/sites/musescore.org/files/2023-01/sfspec24.pdf) compliant binary.\n- **DLS**: DownLoadable Sounds. Sound bank format similar to SoundFont. Used in the older RMIDI files, not compliant with this specification.\n- **Embedded sound bank:** The sound bank embedded within an RMIDI file that is used for playing back the sequence.\n- **Main SoundFont:** The regular SoundFont bank loaded by the software before loading the RMIDI file.\n- **Bank**: MIDI controller 0 `Bank Select MSB` and the bank number of a SoundFont preset. It's a 7-bit value, except for the SoundFont's drum presets, which use bank number 128.\n- **Bank offset:** The number which gets added to each wBank field in all presets within the embedded bank.\n- **RIFF**: Resource Interchange File Format. A file container format for storing data in tagged chunks.\n- **Chunk**: The top-level division of a RIFF file.\n- **Little Endian**: Byte ordering in memory with the least significant byte at the lowest address.\n- **MIDI:** Musical Instrument Digital Interface. a technical standard that describes a communication protocol for a wide variety of electronic musical devices.\n- **MIDI file/SMF:** Standard MIDI File. A sequence of MIDI messages, usually a song.\n- **Note On:** A MIDI message indicating that a given note should be pressed.\n- **Note Off:** A MIDI message indicating that a given note should be released.\n- **GM**: General MIDI system, ignoring all Bank select messages.\n- **XG**: Yamaha Extended General MIDI, an extension to the General MIDI standard created by Yamaha.\n- **GS**: Roland General Standard, an extension to the General MIDI standard created by Roland.\n- **Encoding**: Assigning numbers to graphical characters.\n- **ASCII**: American Standard Code for Information Interchange, a character encoding standard for electronic communication.\n\n## Extension\nThe file extension is `.rmi`.\nThe file type should be referred to as `MIDI with embedded SF2`, `Embedded MIDI` or `SF2 RMIDI`.\n\n## RIFF Chunk\nThe RMIDI format uses RIFF chunks to structure the data.\n\nThe RIFF format is unchanged from the original RMIDI format. Described here for completeness.\n\nEach RIFF chunk in an RMIDI file follows this format:\n- Four bytes: Chunk header in ASCII (e.g., `RIFF`)\n- Four bytes: Chunk size as a 32-bit unsigned little-endian number\n- Chunk data: Optionally, the first 4 bytes of the data represent the chunk type in ASCII (e.g., `sfbk`)\n\n### Example chunk\n`52 49 46 46 05 00 00 00 48 65 6C 6C 6F 00`\n\n- `52 49 46 46` - ASCII string \"RIFF\"\n- `05 00 00 00` - 32-bit chunk length: 5\n- `48 65 6C 6C 6F` - the chunk's data: ASCII string \"Hello\"\n- `00` - a pad byte of 0 to make the total byte count even.\n\n# SF2 RMIDI File Specification\n## File Structure\nAn RMIDI file consists of:\n- `RIFF` chunk (main chunk)\n  - `RMID` ASCII string\n  - `data` chunk containing the complete MIDI file (MThd, MTrk, etc.)\n  - Optional `LIST` chunk: Metadata for the file, similar to SF2's chunk\n    - `INFO` ASCII string\n    - [Inner chunks described here](#info-chunk)\n  - `RIFF` chunk: Complete soundfont binary.\n  It is optional.\n    The first four bytes of this chunk should be `sfbk`, indicating a soundfont2 binary. \n  [SoundFont3 format](https://github.com/FluidSynth/fluidsynth/wiki/SoundFont3Format) is allowed.\n  Note that for legacy files, it may instead be a DLS file.\n  \n### Example file\n- `RIFF` chunk\n  - `RMID` ASCII string\n  - `data` - The MIDI file data: MThd, MTrk etc...\n  - `LIST`\n    - `INFO` ASCII string\n    - `INAM` chunk\n      - `Never Gonna Give You Up` UTF-8 string\n    - `IART` chunk\n      - `Rick Astley` UTF-8 string\n    - `ICRD` chunk\n      - `1987` UTF-8 string\n    - `IENC` chunk\n      - `utf-8` ASCII string\n    - `DBNK` chunk\n      - 16-bit integer: 1\n  - `RIFF` chunk - the SoundFont binary file.\n\nThe following file structure shows that:\n1. The bank offset is 1.\n2. Info chunks are encoded using `UTF-8` encoding.\n3. The song's title is \"Never Gonna Give You Up.\"\n4. The song's artist is \"Rick Astley.\"\n5. The song's creation date is \"1987.\"\n6. The song has an embedded sound bank.\n\n### Handling Differences\nWhen the file structure deviates from the above:\n1. Any additional chunks after the specified ones should be ignored and preserved as-is.\n2. If the chunk order differs from this specification, the file should be rejected.\n3. If no soundfont bank is present, the file should use the main soundfont and assume a bank offset of 0, ignoring the DBNK chunk.\n4. If the soundfont bank uses the older DLS format, software not capable of reading DLS should reject the file. \n\nSoftware that supports DLS should use the contained DLS\nand assume a bank offset of **1** or try to detect the bank offset\nsince the older format does not specify the `DBNK` chunk.\n\nThe last two rules ensure backwards compatibility with the older RMIDI format.\n\n## INFO Chunk\nThe INFO chunk describes file metadata and the soundfont's bank offset.\n\nThe INFO chunk may contain the following optional chunks:\n- `DBNK` chunk: Soundfont's bank offset. See [DBNK Chunk](#dbnk-chunk) for details.\n- `IENC` chunk: Encoding used for the metadata chunks: name of the encoding stored as string.\n  Not case-sensitive, but lowercase is preferred (e.g., `utf-8`).\n  [Software capable of reading the IENC chunk must support the following encodings](#ienc-chunk-requirements).\n  Note that this field must use basic `ASCII` encoding.\n- `MENC` chunk: Encoding hint for the text evens within the MIDI file. The same string format as `IENC`.\n- [Metadata chunks](#metadata-chunks)\n\n### Metadata Chunks\nBelow are the defined chunks containing additional information about the song:\n- `INAM` chunk: Song name/title. String of any length.\n- `ICOP` chunk: Copyright. String of any length.\n- `IART` chunk: Artist (MIDI creator). String of any length.\n- `ICRD` chunk: Creation date. String of any length. **The software must write the date as an ISO 8601 date or date time string.** For example `2025-08-17` or `2025-08-17T19:15:25Z`.  This allows software to parse the date and display it in a different way or use it for management purposes.\n- `IPRD` or `IALB` chunk: Album name. String of any length. It can be used interchangeably. If both exist in the file, the software should use `IALB`.\n- `IPIC` chunk: Attached picture (e.g., album cover). Binary picture data. PNG or JPEG recommended.\n- `IGNR` chunk: Song genre. String of any length.\n- `ICMT` chunk: Comment/description. String of any length.\n- `IENG` chunk: Engineer (soundfont creator). String of any length.\n- `ISFT` chunk: Software used to create the file. String of any length.\n- `ISBJ` chunk: Subject of the file. String of any length.\n\n### Chunk Rules\nThe following rules apply to the INFO chunk:\n1. The order of chunks within the INFO chunk is arbitrary.\n2. Text chunks must contain a terminal zero byte.\n3. Chunks of length 0 are illegal and should be discarded.\n4. Unknown INFO chunks should be ignored and preserved as-is.\n5. If the `IENC` chunk is not specified, the software can use any encoding, but assuming `utf-8` is recommended.\n6. If the `MENC` chunk is not specified, the software decides MIDI's encoding.\n7. If the software can display the song's name, it should use the INAM chunk if present, ignoring the MIDI track name.\n8. Compatible software may ignore all INFO chunks **except the DBNK chunk** for the most basic [level of compatibility](#level-1).\n9. The chunk size must be even, as specified in the general RIFF structure.\n10. The INFO chunk is optional. The software must not assume that the INFO chunk exists.\n\n#### IENC Chunk Requirements\nFor Level 3 compatibility, software must support the following encodings (both lowercase and uppercase):\n- `utf-8`\n- `shift-jis` or `Shift_JIS` (equivalent encodings)\n- `windows-1250` (Central Europe)\n- `windows-1251` (Cyrillic)\n- `windows-1252` (Western)\n- `windows-1253` (Greek)\n- `windows-1254` (Turkish)\n- `windows-1255` (Hebrew)\n- `windows-1256` (Arabic)\n- `windows-1257` (Baltic)\n- `windows-1258` (Vietnamese)\n\nSoftware may decode other encodings but is not required to.\n\n#### IPIC Chunk Requirements\nFor Level 4 compatibility, software must support the following image formats:\n- Portable Network Graphics (PNG)\n- Joint Photographic Experts Group (JPEG)\n\nOther formats (e.g., `gif`, `webp`, `ico`) may also be supported but are not required.\n\n#### DBNK Chunk\nThe DBNK chunk is an optional RIFF chunk within the RMIDI INFO List.\n\nIt describes the **bank offset** for the embedded sound bank.\n\nIt always has a length of two bytes,\nwith these bytes forming a **16-bit, unsigned, little-endian** number. \nIf the chunk's length is not two bytes or the number is out of range, the file should be rejected.\n\nCurrent boundaries are: **minimum: 0** and **maximum: 127**. \nThe other byte is reserved for future use. \n\nIf no DBNK is specified, an offset of **1** is assumed by default.\nIf the file does not contain any Sound bank (SF2 or DLS), the offset shall default to 0.\n\nFor general use, a bank offset of 0 is recommended as it allows bundling the soundfont and the MIDI without modification.\n\n## Embedded sound bank\nThe RMI file may come with an embedded SF2 or DLS SoundFont, usually after the INFO chunk.\nThis sound bank provides the exclusive sounds used within the MIDI sequence,\ntemporarily replacing given MIDI program and bank numbers with the presets contained within the sound bank.\n\n### Bank Offset\nThe bank offset adjusts every bank in the embedded sound bank\n**except for bank 128** by adding itself to every patch's `wBank` field.\n\nFor files without an embedded sound bank,\n the bank offset is ignored and assumed to be 0, regardless of the DBNK chunk if present.\n\nFor example:\n- If a preset named `Acoustic Piano 2` with program 0 and bank 1 exists within an RMIDI file which uses bank offset of 1,\nit should effectively be interpreted as program 0 and bank 2.\n\n- If a preset named `Standard Drum Kit` exists within the same RMIDI file with program 0 and bank 128,\nthe bank will remain 128.\n\nIf the resulting bank number exceeds 127 (except for drum kits) or is smaller than 0, then it should be turned into 0.\n\n\n## Player pseudo code\nBelow is a simple JavaScript-like code for a Level 1 RMIDI-compatible player.\n\nNote: this code does not perform any checks and assumes that the file is valid and contains all three chunks,\nfor the sake of simplicity.\n```js\nconst file = open(\"song.rmi\");\n// read RIFF\nconst chunk = readRIFF(file);\n// skip 'RMID' string\nchunk.data.seek(chunk.data.position + 4);\n// read 'data' chunk\nconst midiChunk = readRIFF(chunk.data);\nconst midiFile = midiChunk.data;\n\n// read the 'LIST' INFO chunk\nconst info = readRIFF(chunk.data);\n// skip the 'INFO' string\nconst infoString = info.data.seek(info.data.position + 4);\nconst infoList = readLIST(info.data);\n\n// bank offset is 1 by default\nlet bankOffset = 1;\n// if DBNK exists\nif(infoList.find(infoChunk =\u003e infoChunk.header === \"DBNK\")) {\n    // DBNK is 2 bytes signed int 16\n    bankOffset = infoList[\"DBNK\"].toSignedInt16();\n}\n\n// clamp the bank offset\nbankOffset = Math.min(Math.max(0, bankOffset), 127);\n\n// read the sound bank (not as a riff chunk but copy the binary content)\nconst soundFont = chunk.slice(chunk.data.position, chunk.data.length - chunk.data.position);\n\n// initialize the synthesizer\nconst player = new Player(soundFont);\n\n// adjust bank offset\nfor(const preset of player.soundFont.presets)\n{\n    preset.bankNumber += bankOffset;\n}\n\n// play the song\nplayer.play(midiFile);\n```\n\n## Software Requirements\nNot all chunks in the file must be read for the file to play correctly. Software compatibility with the RMIDI format is categorized into levels:\n\n### Level 1\nMinimum requirements for the software to be compliant. The software must:\n- Read and interpret the `RMID` ASCII string as the file indicator.\n- Handle the `data` chunk containing the MIDI data.\n- Process the `DBNK` chunk within the INFO chunk and correctly offset the soundfont (or a bank select messages in the MIDI) based on this value.\n- Read the `RIFF` chunk with the soundfont data.\n\nThis level ensures the correct playback and is recommended for software that does not need to support metadata.\n\n### Level 2\nThis level requires basic interpretation of the `INFO` chunk. The software must:\n- Read all Level 1 chunks.\n- Interpret all metadata chunks (`INAM`, `IPRD`, `ICRD`, `ICOP`, etc.) as `ASCII` or `utf-8`.\n\n### Level 3\nThis level requires support for the `IENC` chunk. The software must:\n- Read all Level 1 and Level 2 chunks.\n- Interpret the `IENC` chunk and support the [required encodings](#ienc-chunk-requirements).\n\nAs of 2024-08-07, Falcosoft Midi Player meets this level of compatibility.\n\n### Level 4\nThis level requires support for the `IPIC` chunk. The software must:\n- Read all Level 1, Level 2, and Level 3 chunks.\n- Interpret the `IPIC` chunk and support the [required image formats](#ipic-chunk-requirements).\n\nAs of 2024-08-06, SpessaSynth meets this level of compatibility.\n\nAs of 2024-08-20, foo_midi meets this level of compatibility.\n\n## Types of RMIDI Files\nThere are currently two distinct types of RMIDI files that vary in their use cases.\n\nNote that these have identical file structure; these vary only in the way they provide sounds for the sequence.\n\n### Self-Contained File\nA self-contained file is defined as a SF2 RMIDI file which only refers to its own SoundFont bank,  \nand the said bank contains **all and only** the necessary presets to play the file.\nIt is recommended to use DBNK of 0 for writing such files, but it is not required.\n\nWriting self-contained RMIDI files is recommended, but not required.\n\n### External File\nAn external file is defined as a SF2 RMIDI file which relies on a complete sound bank loaded as a fallback with the embedded sound bank only containing special sound effects, specific to the file.\n\nThe software not capable of loading two sound banks at once (the main one and the embedded one) may reject the file.\n\nThis type of file usually uses bank 1 or greater, but it may use bank 0.\n\n## Recommendations for Writing RMIDI Files\nThe following recommendations are not required for file validity but are advised:\n1. Trim the soundfont to include only presets and samples used in the file to save space.\n2. Write a self-contained file to ensure that it will sound the same in every software.\n3. Always include the DBNK chunk, even if the offset is 1.\n4. Include the IENC chunk to ensure correct encoding is used.\n5. Include the MENC chunk if the encoding is known, to help other software read the MIDI text events correctly.\n6. Use the `utf-8` encoding for the metadata chunks if possible.\n7. Use SoundFont3 compression if available to save space.\n\n## Example Files\nThe directory [examples](examples) contains RMIDI Files for testing:\n\n- `Field of Hopes and Dreams` - complete, level 4, self-contained file with IPIC chunk and metadata. Offset 0. Uses SF3 compression.\n- `GRABBAG_EmbeddedSF2` - self-contained file with no `DBNK` chunk. Offset 1.\n- `offset_5` - self-contained file with offset of 5.\n- `Rock_test` - external file with no `DBNK` chunk. Offset 1, expects a full GM sound bank loaded at bank 0.\n- `bachsb` - an RMIDI file without an embedded sound bank.\n- `AWEBLOWN` - a DLS RMIDI file no `DBNK` chunk.\n  Offset 1, expects a full GM sound bank loaded at bank 0. \nSoftware not capable of reading DLS should reject this file.\n\n\n## Reference Implementation\nBelow is SpessaSynth implementation of the format in JavaScript, which may be useful for developers:\n\n- [Loading the file](https://github.com/spessasus/spessasynth_core/blob/a7537f850110cc345a9484c081bf77a25422d9dd/src/midi/midi_loader.js#L45-L145)\n- [Writing the file](https://github.com/spessasus/spessasynth_core/blob/a7537f850110cc345a9484c081bf77a25422d9dd/src/midi/midi_tools/rmidi_writer.js)\n- [Removing unused samples from a sound bank](https://github.com/spessasus/spessasynth_core/blob/a7537f850110cc345a9484c081bf77a25422d9dd/src/soundfont/basic_soundfont/basic_soundbank.js#L386-L576)\n- [Decoding and displaying the metadata](https://github.com/spessasus/SpessaSynth/blob/ba099282680300c8e7c1ef4cf58e565f92f32c67/src/website/js/music_mode_ui/music_mode_ui.js#L125-L183)\n\n## Legal Notice\nThis document is in no way endorsed or otherwise affiliated with the MIDI Manufacturers Association,\n Microsoft,\n Creative Technology Ltd. or E-mu Systems, Inc.,\n  or any other organization mentioned in this document.\n  \nSoundFont® is a registered trademark of Creative Technology Ltd.\n\nAll other trademarks are the property of their respective owners.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspessasus%2Fsf2-rmidi-specification","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspessasus%2Fsf2-rmidi-specification","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspessasus%2Fsf2-rmidi-specification/lists"}