FSPDS
Flipnote Studio Player for Nintendo DS
Install / Use
/learn @NotImplementedLife/FSPDSREADME
<img src="icon.bmp"></img> FSPDS - Flipnote Studio Player for Nintendo DS
<img alt="GitHub Top Language" src="https://img.shields.io/github/languages/top/NotImplementedLife/FSPDS" /> <img alt="Github License" src="https://img.shields.io/github/license/NotImplementedLife/FSPDS" /> <img alt="GitHub Issues" src="https://img.shields.io/github/issues/NotImplementedLife/FSPDS" /> <img alt="GitHub Closed Issues" src="https://img.shields.io/github/issues-closed/NotImplementedLife/FSPDS" /> <img alt="GitHub Last Commit" src="https://img.shields.io/github/last-commit/NotImplementedLife/FSPDS" />
<a href="https://notimplementedlife.itch.io/fspds"></a>
<a href="https://youtu.be/3NL79zHFvF8">
</a>
Note from January 2021 : "Unburied" dekvkitPro from a 3yo hard disk backup, so I decided to give it a go :)
This simple ROM allows you to play flipnotes on Nintendo DS (Lite) using your flashcard.
Features
Flipnote player
FSPDS allows DSi flipnote playback providing an experience similar to a common media payer. It supports pause/resume options, auto repeat, direct navigation to the previews/next flipnote and shuffling. It should be able to play any flipnote that runs correctly in the original Flipnote Studio.
Small notes on the filesystem
For faster load times, FSPDS prescans the folders for flipnotes and stores their paths onto the SD card. Therefore, when the user changes the content of their flipnote folders, a directory reindex must be performed. This way, FSPDS cached data will be up to date with the actual files structure. Not reindexing might cause new flipnotes not showing up in the list, or deleted flipnotes still persist in a phantom state in the application, fact denoted by the dead green frog thumbnail.
Bugs/Limitations
- FSPDS doesn't detect/play flipnotes larger than 1MB (this is intentional behavior)
- The flipnote's BGM track should be smaller than 512KB in order to be played correctly. However, the DSi Flipnote Studio only allows for 1 minute of raw audio (8192Hz) to be encoded into a flipnote, which means at most 240KB of sound data. Therefore, FSPDS should not have problems playing original flipnotes. Spin-off flipnotes which contain huge audio data may not play correctly with this application.
- Crashes on the Flipnote Lenny ( ͡° ͜ʖ ͡°) files.
Possible improvements
- More generous limitations when the application runs in DSi mode to support more "unofficial" flipnotes. Example: 4MB PPM file size, max 1MB audio etc.
Tested on
- DeSmuME emulator
- no$gba with DSi NAND & virtual SD card
- Nintendo DS Lite with R4(i) flashcards
- Nintendo DSi
<b>Tested on DeSmuMe emulator and R4(i) flashcards </b>
Hardware vs emulator compatibility
- On the hardware, loading files from FAT system is substantialy faster;
How to build
git clone https://github.com/NotImplementedLife/FSPDS.git
cd FSPDS
make
Python is required to run a build tool script.
For non-Windows systems, the most challenging part would be running DSC.Toolchain.AssetBuild.exe. I'm not a Linux user myself and I can't provide reliable guidance in that problem, but some program like Wine or mono could be of some help, or you can even rebuild the executable directly from its source code.
Screenshots
<p align="center"> <img width="500" src="https://github.com/NotImplementedLife/FSPDS/assets/70803115/f924d76b-3bc4-4c0f-b04f-0c42a2db8568" alt="ROM in action: Title screen"></img> <img width="500" src="https://github.com/NotImplementedLife/FSPDS/assets/70803115/965c76f8-8c71-46ec-8186-e052784b61d6" alt="ROM in action: Browse flipnotes"></img> <img width="500" src="https://github.com/NotImplementedLife/FSPDS/assets/70803115/f434f8e2-f3cb-4a62-a070-500ebe19aee0" alt="ROM in action: Pick a flipnotes directory"></img> <img width="500" src="https://github.com/NotImplementedLife/FSPDS/assets/70803115/816fba2d-3c96-41da-95bc-7e05ee324e4a" alt="ROM in action: Help screen"></img> <img width="500" src="https://github.com/NotImplementedLife/FSPDS/assets/70803115/f87bf35a-ba11-4c21-87ea-f6fe093b096a" alt="ROM in action: Flipnotes list 1"></img> <img width="500" src="https://github.com/NotImplementedLife/FSPDS/assets/70803115/0daac322-0788-4a06-9b0b-0e24dea0ae1d" alt="ROM in action: Flipnotes list 2"></img> <img width="500" src="https://github.com/NotImplementedLife/FSPDS/assets/70803115/248c3118-3f92-42e8-8b4e-73929af62f45" alt="ROM in action: Flipnote player"></img> </p>History
Following the successful attempt to create a flipnote editor for PC, FlipnoteDesktop, (now named Flipnote.NET), I had a pretty fresh knowledge of the flipnote format and was wondering whether a regular Nintendo DS could handle flipnote playback or not. That time, I found myself facing what I thought it was an incredibly complex task, with astounding challenges which could reveal deep holes in my knowledge about the DS homebrew and programming. And my intuition was right... Considering how many questions I had regarding this problem, among which the most relevant one was "is it even possible?", I wasn't sure if starting this project was a good idea. But eventually, curiosity killed the cat and I convinced myself that the worst thing that could happen was to lose time creating a crappy thing that I'd add to my remarkable collection of <i>ideas_that_I_like_but_I_am_too_dumb_for</i>. However, it turns out FSPDS was one of my very first serious projects I started to work on that didn't actually end up tossed in the abyss of failure, abandonment and forgetting.
I created this repository on January 27th, 2021, using a Code::Blocks template for libnds that I learned how to set up in 2016 when I first got into DS programming. For all those years I was extremely stubborn in my belief that this was the only good and real way to organize a C++ project. In reality, my deep subconscious knew that Code::Blocks was the "safe territory", as I was literally scared of Makefiles (after I learned what those things are), and my laptop's performance was easily outplayed by any sophisticated IDE such as Visual Studio.
To make an idea of the skills I possessed at the moment of starting the project, I only knew the very most basic thing about libnds. I knew how to "Hello world" with consoleDemoInit();, how to draw normal bitmaps and corrupted bitmaps (if I wasn't lucky enough to have the correct bits per pixel value already set by the template code I used), double buffering I read about on a forum and how to handle key inputs at the happiest level of calling the libnds functions and by the particularly fateful chance of knowing what bitwise operations are. One could say I was completely hopeless and I should give up or learn more and try later (and couldn't be more right). But you know the saying: what you don't know won't hurt you. In my courageous lack of experience I dared to say that what I knew was more than enough to achieve my goal.
It wasn't more until I created the visual and structural framework for the application. I opted for a tabsystem as I thought it was the easiest thing to do when the only UI refresh routine you master is roughly consoleClear(), gotoxy() and iprintf(). I'll never forget the moment an innocent Google search with debug purposes brought me to the GodMode9i source code lines which overwrite the default console characters font in order to make custom symbols. To me that was an extraordinary breakthrough and in my excitement I felt like was doing magic. I ended up using the "font overwrite trick" (which otherwise wasn't anything than a VRAM write to a certain tile address) to create a fancy border around my tabs enhancing the look of my application.
Not so long after, I managed to put all the pieces in the right place and managed to create a working flipnote player prototype. At least, the visual part. In order to do that, I followed the Flipnote Collective's specifications on PPM format to the letter, without realizing that the suggested code for frame decoding was just an example to understand the process, instead I simply assumed that was the most efficient approach. That problem made itself visible almost immediately through an annoyingly poor flipnote playback performance compared to the original Flipnote Studio. One of the flipnotes I used to perform tests on, authored by Mr. Mask featuring a fox inside a Zelda-like dungeon, which was normally a measured 21 seconds long as far as I can remember, was taking more than 50 seconds to completely play in FSPDS. The reason was obviously related to the inefficient code which caused VBlank logic to happen some frames later than usual, explaining the inflated flipnote play time. And refactoring it wasn't a straightforward task at that time, as it implied taking in account a handful of factors, like the line encoding and the frame diffing, which by itself was really scary. After an intense brainstorm and some experiments, I came up with an idea I was overwhelmingly proud of, and I still am to this day, even if it has meanwhile become obsolete. I took advantage of the fact that the flipnote maximum frame rate was 30fps, whilst the DS screen refresh rate is 60Hz, which meant a speed 8 flipnote would change its frame once at 2 VBlank periods, therefore I could theoretically split the frame decoding into two parts: let's say the first 96 lines are decoded in the first VBlank, and the
Related Skills
node-connect
342.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
85.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
342.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
342.5kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
