Yamaha's '[b]XG'[/b] (eXtended General MIDI) is a set of proprietary extensions to the GM MIDI protocol standard. Introduced in 1994, it sought to improve on GM's features by defining more instruments, implementing audio processing effects, and other commands not available in GM-only synths. Think of it as proprietary MIDI Plus! This article is intended to cover XG in the scope of BotB's format, which is restricted to '[b]only S-YXG50 or MU 50'[/b] due to many XG synths having different/upgraded sounds and features. S-YXG50 is the free and easily available option for XG, so '[[List of legal XG patches[the sounds available to S-YXG50] are the focus of the BotB format. S-YXG50 only supports a single MIDI input port and thus is a 16-part (channel) synth, just like good old MSGS. XG itself comprises many different physical and software synth implementations, all of which have their own features, effects and soundsets, but most of them would be unsuitable for BotB due to not being free. You can check out a full list of XG-supported hardware units '[l[https://en.wikipedia.org/wiki/Yamaha_MU-series[here] and software synths '[l[https://soundprogramming.net/software/yamaha-xg-software-synthesizer/[here]. '[#[I have never done this format] You have some options to make XG MIDIs! 1) use the '[l[https://veg.by/en/projects/syxg50/[SYXG50 VST] in your DAW of choice, set up in a similar manner to how you'd set up '[[midi (format)[MSGS MIDI], '[[C700 VST], or MuntVSTi for '[[mt32 (format)[MT-32]; run 16 MIDI Out channels through it. 2) use dedicated software such as Yamaha's '[l[http://xg-central.com[XGWorks] (for easiest control over XG-specific effects). 3) use another MIDI sequencer such as '[l[https://openmidiproject.osdn.jp/Sekaiju_en.html[Sekaiju] or '[l[https://github.com/Hans5958/Domino-English-Translation[Domino]; others listed in the Software section below. 4) set up your DAW of choice to send 16 channels of MIDI to a Yamaha MU50 (make sure each channel outputs to only one number channel, 1-16) '[#[What can I do with XG over MSGS?] As mentioned, XG offers many more options for proud MIDI warriors than '[[midi (format)[MSGS MIDI] does: • '[b]Bank Control'[/b]: Several variants of each patch are available to use, for a sum total of 480 melodic voices, 9 drumkits and 2 SFX banks! Unlike MSGS, you don't need to use SysEx to access them; instead use CC32 '[b]followed by'[/b] a Program Change event. A '[b]full list of available XG patches'[/b], and the CC32 value ("Bank LSB") required, can be found '[l[https://docs.google.com/spreadsheets/d/1wzCzymKyAXZobQqsGkxwWAxOylRi-4L_hZM_BfiGZjo/edit#gid=0[here]! CC0 also does some Bank Control for SFX and drums. >> '[[List of legal XG patches[See the full list of legal XG patches on BotB here.] • '[b]More effects'[/b]: Access some wonderful features like Portamento (CC65 off/on, CC5 duration control), Filters (CC71 resonant filter, CC74 lowpass filter), ADSR (CC72 release, CC73 attack), and many more! >> '[[xg (format)#CC Controllers[See the full list of XG CCs below.] • '[b]Global effects'[/b]: In addition to coming with global Reverb and Chorus, XG lets you use SysEx messages to control additional effects like Flanger and Distortion (as well as apply changes to any of the global effects). Note that not all DAWs and sequencers support SysEx (*cough* FL Studio *cough*) so you may need to use an additional tool to manipulate this data, such as '[l[https://www.bome.com/products/sendsx[Bome SendSX]. >> Read more about '[[xg (format)#Effects[Effects in XG below] and '[[xg (format)#SysEx Messages[SysEx in XG below] as well. '[#[Restrictions on submit] '[t[b2]BotB entries must only use S-YXG50 (or MU50)!!! Anything else might support more features than either or just have different sounds and may therefore be illegal.'[/t] Submissions - restricted to .mid, naturally - should be playable through either Falcosoft MIDI Player ('[l[http://xg-central.com/playback-xg-midi-files-on-windows.php[setup guide here]) or SYXG50 VST itself. Renders - S-YXG50 and the Yamaha MU50 are the only legal means. It is worth mentioning that renders between the two will vary slightly, particularly in how they handle Velocity and Expression, as well has how many simultaneous CC commands can be utilized. '[#[CC Controllers] '[t[b1]CC controllers supported by XG include:'[/t] '[t[b2]BANK CONTROL:'[/t] '[t[b0]'[o]//Both types of Bank Control messages must be followed by a program change message, otherwise they have no effect'[/o]'[/t] • CC 0 - Bank MSByte [Data range: 0:Normal 64:SFX voice 126:SFX kit 127:Drum] • CC 32 - Bank LSByte (voice variation) [Data range: 0-127] '[t[b2]MODULATION AND PORTAMENTO:'[/t] • CC 1 - Modulation (Initialised to Vibrato Depth by default, different target set with SysEx) • CC 5 - Portamento duration '[t[b2]DATA ENTRY:'[/t] '[t[b0]'[o]//Used to provide the data for (N)RPN parametres to change'[/o]'[/t] • CC 6 - Data Entry MSB • CC 38 - Data Entry LSB '[t[b2]MISCELLANEOUS:'[/t] • CC 7 - Part volume • CC 10 - Panpot • CC 11 - Expression (Dynamic control of part's loudness mid-sequence. Use instead of CC 7 for creating short, dynamic volume variations) • CC 64 - Sustain toggle (<64dec to disable) • CC 65 - Portamento toggle (<64dec to disable) • CC 66 - Sostenuto toggle (<64dec to disable) • CC 67 - Soft Pedal toggle (<64dec to disable) '[t[b2]ADSR/FILTER CONTROL:'[/t] '[t[b0]'[o]//This section doubles some of NRPNs in a more accessible form for the most used ADSR controls. It also reduces the MIDI data usage compared to NRPNs, making it a more appropriate choice for real-time manipulation from within the sequence.'[/o]'[/t] • CC 71 - Resonant filter strength • CC 72 - ADSR Release • CC 73 - ADSR Attack • CC 74 - Low-Pass filter cutoff • CC 84 - Portamento Control '[t[b2]FX SEND CONTROL:'[/t] • CC 91 - FX Reverb Block Send • CC 93 - FX Chorus Block Send • CC 94 - FX Variation Block Send (System mode only, doesn't apply to IFX - see below) '[t[b2]NRPN Data Entry Incrementation/Decrementation:'[/t] '[t[b0]'[o]//DATA byte of the midi message will be ignored'[/o]'[/t] • CC 96 - Data Increment • CC 97 - Data Decrement '[t[b2]NRPN (Non-registered parametre number) select:'[/t] '[t[b0]'[o]//First send the NPRN MSB and LSB to select the control parametre, then set the value by Data Entry. Refer to the specification too see the full NRPN parametres table'[/o]'[/t] • CC 98 - NRPN LSB • CC 99 - NRPN MSB '[t[b2]RPN (Registered parametre number) select:'[/t] '[t[b0]'[o]//Same procedure as with NRPNs applies'[/o]'[/t] • CC 100 - RPN LSB • CC 101 - RPN MSB '[t[b2]Channel Mode Messages:'[/t] • CC 120 - All Sound OFF {data range: 0) - cuts all sound immediately • CC 121 - Reset All Controllers {data range: 0) • CC 123 - All Notes OFF (data range: 0) - releases all notes '[#[Effects] XG defines three types of effects that can be used to further shape the sound to your liking: • [Required] System Effects: These are Reverb and Chorus and are applied to all parts (using the same settings - there's only one slot per each of them and all parts (channels) send to the same System FX block. You can alter the signal send level of each part independently to control the intensity of the effect on a per-channel basis. • [Required] Variation Effects (VFX) - at least one slot per synth is required by specification. The effect type (i.e. Distortion, Flanger, etc.) and all parametres of VFX are freely configurable by the user through SysEx messages. Unique attribute of VFX is that they can be set to function either as System Effect (see above) or Insert Effect (IFX) - refer to the description of IFX below for details. Default mode for VFX is Insert. • [Optional] Insert Effects (IFX): These effect blocks are assignable via SysEx messages, ONE effect per SINGLE channel at a time. These are optional in XG, so it's safer to assume that the target synth doesn't implement them, for maximum compatibility unless you're targeting a specific XG device. S-YXG50 used on BotB sadly doesn't support any IFX. The easiest way to access and edit FX and their settings is to use Yamaha's XG-ready sequencers with visual editors like XGWorks, but you can always control it manually using SysEx messages. Refer to the XG Specification documentation for details (linked at the bottom). '[#[SysEx Messages] '[t[b1]You can control most of the synth's parameters by SysEx messages. SysEx DATA always begins with 0xF0 and is terminated with 0xF7. Any synth-specific data goes inbetween.'[/t] An example message might look like this: • '[t[mono]XG System ON: F0 43 10 4C 00 00 7E 00 F7 [hex]'[/t] - resets the synth and switches it into XG mode. This is not required, but does simplify the process for playback if someone forgets to put their synth or player in the correct mode. '[t[mono] Message breakdown: 11110000 F0 Exclusive status 01000011 43 YAMAHA ID 0001nnnn 1n Device Number 01001100 4C Model ID 00000000 00 Address High 00000000 00 Address Mid 01111110 7E Address Low 00000000 00 Data 11110111 F7 End of Exclusive '[/t] • '[t[mono]XG Universal Realtime System Volume: F0 7F 7F 04 01 11 [MM] F7 [hex]'[/t], where MM is the volume MSB. Useful for master volume fades. '[t[mono] Message breakdown: 11110000 F0 - Exclusive status 01111111 7F - Universal Realtime ID 01111111 7F - Device ID 00000100 04 - Sub ID1 00000001 01 - Sub ID2 0lllllll ll - Master Volume LSB 0mmmmmmm mm - Master Volume MSB 11110111 F7 - End of Exclusive '[/t] '[#[Tools for creation] • Yamaha XGWorks (you can find it on '[l[http://xg-central.com[XG Central]) • Yamaha SOL (possible to find on Archive) • '[l[https://openmidiproject.osdn.jp/Sekaiju_en.html[Sekaiju] • Domino Sequencer '[l[https://github.com/Hans5958/Domino-English-Translation[English translation] • '[l[http://www.frieve.com/english/musicstd/download.html[Frieve Music Studio] • '[l[https://www.bome.com/products/sendsx[Bome SendSX] (SysEx scratchpad, useful for quick testing stuff, alternatively '[l[http://www.midiox.com/app.htm[MIDIOX] also has such a feature but it's a part of a much more complex routing/monitoring program) • '[l[https://mountainutilities.eu/xg[XG Manager] XG voice editor and bank manager for Windows. • '[l[https://qxgedit.sourceforge.io/[QXGEdit] XG voice editor for Linux / Qtractor. • '[l[http://magarchive.halfmoon.jp/vector/midiexp/index.html[MIDI Espressivo] XG Voice editor & the probably the only tool to convert bitmap animation frames to "Display:bitmap" sysex. Just grab the data from the "sample.mid" file it saves to. '[#[Tools for playback] • '[t[b1]S-YXG50 synthesiser VST'[/t] - unofficial download '[l[http://veg.by/en/projects/syxg50/[here] (first link) • '[l[http://falcosoft.hu/softwares.html#midiplayer[Falcosoft MIDI Player (Win)] for hosting the S-YXG50 VST (more advanced than SaviHost) >> '[t[b1]Follow XG-Central's Guide' for setting up the Falcosoft MIDI Player '[l[http://xg-central.com/playback-xg-midi-files-on-windows.php[here]'[/t]. • '[l[https://www.foobar2000.org/[Foobar2000 (Win/Linux+WINE)] with the '[l[https://www.foobar2000.org/components/view/foo_midi[foo_midi plugin] >> '[t[b1]Follow Yamaha S-YXG50 VSTi page for setting up the foo_midi component '[l[https://veg.by/en/projects/syxg50/[here]'[/t]. • '[l[https://github.com/ltgcgo/octavia[Octavia] This player does not produce sound or send midi to external devices, but rather plays midi data synced to recorded audio for embedding on a web page. It can simulate the LCD of an MU-series module, for viewing of voice states or embedded display:text or display:bitmap data during playback. '[#[Examples of XG music] So, what can it actually do, and what does it sound like? Here are several examples of XG music, all rendered with S-YXG50: • '[l[https://www.youtube.com/watch?v=JgFy-iY8xvA[Around 50 minutes of Yamaha's XG demo tracks] (YouTube video) • '[l[https://drive.google.com/file/d/12lhjzNLie7qVMW73TIB1nwh-AOr9eKbM/view?usp=drivesdk[Pastel Reverie by Wally Chantek] • '[l[https://drive.google.com/file/d/1W3iwCxp_IA5NNdwdWjtAZdzFmOsh_lbj/view?usp=drivesdk[XGroove by Yasutaka Nakata] • '[l[https://drive.google.com/file/d/12u7b6aY3B6kjj-e6zqIH-fkBaiBX2-qA/view?usp=drivesdk[Tenshi.mid] • '[l[https://drive.google.com/file/d/1QxUFIpyzDTjvvogNiBqSqzbJkaxxRFMC/view?usp=drivesdk[Cafe Jungle, produced by Yamaha MusicSoft Europe] • '[l[https://drive.google.com/file/d/1AB7wV2yMNEbwrlQ2nPIQmxuOqw3tE5U7/view?usp=drivesdk[Cop Out, produced by Yamaha MusicSoft Europe] '[#[See also + other links] • '[[List of legal XG patches] • '[l[https://docs.google.com/spreadsheets/d/1wzCzymKyAXZobQqsGkxwWAxOylRi-4L_hZM_BfiGZjo/edit#gid=0[MIDI patches list] by MelonadeM (lists all available sounds for the XG format in the "S-YXG50" column, and the CC32 value ("LSB") required to get that sound) • '[[MIDI (format)] • '[[MT32 (format)] • '[[C700 VST] (if you are unsure how to set up a VST for MIDI, the C700 guide may help you) • '[l[http://geertjalink.nl/downloads/yamaha/manual/SYXG50data.pdf[S-YXG50 Data] - XG instrument map layout; in Japanese, but just the tables, so should be understandable even if you don't know the language. • '[l[https://web.archive.org/web/19970616180425/http://www.yamaha.co.uk/download/syxg50/sxg5095.exe[S-YXG50 Guide] - General guide, published by Yamaha UK, contains instrument table. • '[l[https://www.youtube.com/watch?v=PF9ul5JFAH0[Video introduction to XG synths by Speedy] • '[l[https://www.tobias-erichsen.de/software/loopmidi.html[loopMIDI] MIDI routing software - pretty much essential if you want to interface with S-YXG50 outside of a DAW. If you need a solution compatible with Windows XP '[l[http://www.midiox.com/myoke.htm[MIDIYoke] has you covered.