Original parsing code from city41/stepcharts. Props to Matt for building a really sweet site.
Works both in node (server-side or CLI) and in browser. Bun and Deno support is untested, but an interesting future to explore!
Install with npm install --save simfile-parser or yarn add simfile-parser
// in node.js >= 16.9.0import{parseAllPacks,parsePack,parseSong,calculateStats,}from"simfile-parser";// Use one of the three parsing functions depending on your needs:constallMyStuff=parseAllPacks("/pathToStepmania/Songs");constaGreatPack=parsePack("/pathToStepmania/Songs/DDRMAX2");constaGreatSong=parseSong(".../Songs/Easy as Pie 2/Abracadabra");// you can get some top level info about a song's contents too:calculateStats(aGreatSong.charts["single-challenge"]);/* returns:{ "freezes": 111, "gallops": 0, "jacks": 22, "jumps": 8,}*/Support dragging packs directly into a web app by parsing in-browser!
// requires typescript 5.0 in "Bundler" module resolution mode for typingsimport{parsePack}from"simfile-parser/browser";// necessary to enable data dropsdocument.body.addEventListener("dragover",function(e){e.preventDefault();});document.body.addEventListener("drop",asyncfunction(e){// also necessary to prevent browser navigating to dropped folderevt.preventDefault();if(!evt.dataTransfer){return;}if(evt.dataTransfer.items.length!==1){console.error("too many items dropped, try just one folder");return;}try{constpack=awaitparsePack(evt.dataTransfer.items[0]);console.log(`parsed pack "${pack.name}" with ${pack.songCount} songs`);}catch(e){console.error(e);}});