This is the home page for NCSF, a PSF-style file format created by Naram Qashat (CyberBotX).

NCSF (Nitro Composer Sound Format) Specification v1.1

NCSF Files

History

Introduction

NCSF (Nitro Composer Sound Format) is a PSF-style for Nintendo DS music, specifically music that was created via Nitro Composer, a tracker-like composer that is part of Nintendo's Nitro SDK for the Nintendo DS. NCSF uses the same format as PSF, with a version byte of 0x25.

File Format

(See PSF Specification for more details.)

(Unless otherwise stated, all integers are stored in little-endian format.)

Like a PSF, the file will begin with 3 bytes, 'PSF', followed by a single byte for the version, 0x25 in the case of NCSF. Following this is the size of the reserved section as a 32-bit unsigned integer, the size of the program section as a 32-bit unsigned integer, and the CRC-32 of the program section as a 32-bit unsigned integer.

The reserved section comes next. For NCSF, the reserved section can be empty (usually in the case of a NCSFLIB file) or it will contain a single 32-bit unsigned integer. In the latter case, this value is the number of the sequence to play, which is a 0-based index corresponding to the index of the sequence within the INFO section of the SDAT (see the program section for details).

The program section comes next. For NCSF, the program section can be empty (usually in the case of a MININCSF file) or it will be a zlib-compressed SDAT. SDATs are the sound data files created by Nitro Composer, and will be found in a Nintendo DS ROM if the game used this format for its sound. The size of the uncompressed data is the size of the SDAT, which is stored in bytes 8-11 of the uncompressed data. There is no need to store an extra "header" containing the uncompressed size due to this.

The remainder of the file will contain the tags for the song. The tags start with 5 bytes, '[TAG]', followed by the tags. See the PSF Tag Format for more details on the tag format.

Creation of NCSFs

NCSFs can currently only be created via a command line program by CyberBotX. The program will take a Nintendo DS ROM, search for SDATs within it, merge all the SDATs into a single SDAT, clean the SDAT of all excess data (all duplicates will be removed, and the final SDAT will contain only the sequences, the sound banks used by those sequences, the wave archives used by those sound banks, and the players used by those sequences), and then creates the NCSF files (usually a single NCSF if only 1 sequence was found, otherwise it will create an NCSFLIB along with multiple MININCSF files). Sequences will be timed automatically, optionally setting how many times it loops (default is 2). In its default mode, it will prompt the user for which sequences to save. This can be set to an automatic mode via a command line flag.

Please note that this program currently does NOT save any STRMs (or streams) contained within the SDATs. This will be included in a future revision.

The program, NDStoNCSF, can be found here: SDATStuff.zip

The timing aspect of NDStoNCSF uses a modified version of FeOS Sound System along with some code from DeSmuME (see the NCSF Player section). It is mostly accurate. If the time can not be determined within a short amount of time (3 seconds for all songs, plus an additional 6 seconds for one-shot songs), it will not time the song.

Also contained in the archive is a program called 2SFTagsToNCSF. The purpose of this program is to easily copy tags from existing 2SF sets to an NCSF set. This will only work on 2SF sets which use Caitsith2's Legacy of Ys driver.

(NOTE: This archive also contains 2 other programs, SDATStrip and SDATtoNCSF. The functionality of these programs have been superceded by NDStoNCSF, and thus they may be lacking in features. If there is a demand for these separate utilities, they will be updated.)

GitHub

The source code of the above programs can be found on GitHub.

NCSF Player

Winamp

The Winamp plugin is by CyberBotX. The plugin uses an xSF framework that was loosely based off the existing vio*sf Winamp plugins. For parsing the sequences, the plugin uses a modified version of FeOS Sound System, a library by fincs for the Nintedo DS operating system, FeOS. This library was meant to be used on a physical Nintendo DS, and was modified in a way to simulate what the Nintendo DS would be doing with the music. The plugin also uses modified portions of code from DeSmuME for its sample generation. The plugin pre-converts all the waves needed by the sequence into 16-bit PCM format, regardless of the original format of the wave (which can be either 8-bit PCM, 16-bit PCM, or IMA ADPCM). This means it may use up slightly more memory on large samples.

The plugin, in_ncsf, can be found here: in_ncsf.zip

Playback is as accurate as possible. If you seem to encounter issues, please do not hesitate to contact CyberBotX about it.

GitHub

The source code of the above plugin can be found on GitHub.

foobar2000

The foobar2000 plugin is by kode54. It is based off of the above Winamp plugin.

The plugin, foo_input_ncsf, can be found here: foo_input_ncsf

Any playback issues that are in the Winamp plugin will most likely also be in the foobar2000 plugin.

Why NCSF?

NCSF is meant to eventually replace 2SF. 2SF is another PSF-style format which utilizes a Nintendo DS ROM loaded into the Nintendo DS emulator, DeSmuME, to play back its music. Because of the size of the emulator and the emulation of the DS's ARM7 processor, plugins like vio2sf are much larger and somewhat slower (this is mostly noticeable when using Winamp's ReplayGain calculation or Format Converter). Most current 2SFs (as of 2013) use a modified ROM of Legacy of Ys that has been hacked to only play music. In some ultra-rare cases, this ROM has been unable to play music from some games. NCSFs use the SDAT of a game directly, can potentially be smaller (although they may be larger in some rare cases), and the lack of full emulation makes playback of NCSFs slightly faster.

Question/Comments/Concerns/Feedback?

Email Naram Qashat (CyberBotX) (Please include NCSF in the subject line)