Well, 25 kbps is slower than the 57.6 kbps can easily do in software on the NES, but the big advantage is that you get buffering, critical for music players and such. Is this interface synchronous, where the Arduino is clocked by the controller strobe rather than requiring cycle-timed NES code when reading?
The transfer rate was much faster but at some point in development I had a couple of glitchy tiles so I added a delay subroutine with about 30 NOPs out of frustration. I'll reduce/remove the routine when I get home and take another capture. But yeah you don't have to poll the controller port (no cycle timed code!) - the arduino responds to an STA $4016 by putting the next byte in the buffer out on the line and a LDA $4017 will clock out the next bit. It took a lot of wrestling with the atmega interrupts to get this to happen! There is a 128 byte buffer for the serial messages from what I understand - the serial is actually setup as 57600 to the UART but it seems that the NES has always pulled the messages out fast enough that it never has overflowed.
akira^8GB wrote:
How well does this thing receive MIDI messages? I heard MIDINES has trouble receiving really fast changes...
Extremely well - I ran my guitar pro stuff through it with a bunch of chords across 3 instruments without any delay (played out as consistently tight arpeggios) - this was with the PPU disabled so I'll have to stress test it again with the new visualization stuff. I've never used a MIDINES but I'd love to see how they compare side by side. Here is an early video of testing for you.
What's the maximum transfer speed a NES program could receive at
Right now I have it running at about 1/3 of the speed for stability (I have a subroutine with a bunch of NOPs in it - I'll probably reduce them one by one until I find the magic number as the Arduino is a little unstable). The blue line is STA $4016 latching and the yellow line is LDA $4017 clocking the next pulse. So right now it's around 25Kbps - but I've gotten it near 100Kbps without any glitches.
nickmaynard wrote:
(NSF player) - can you talk more about this?
Sure! I modified an NSF player to dump the $40xx registers over the serial line everytime they are written to in the software. The NES software is simple, it just takes the value and writes passes it to the proper sound register. Samples didn't work of course but everything else sounded perfect.
I've been working at a serial connection to the NES for a few months now. At first I came up with a board to try and establish a serial line to the NES through the controller port - I only made 2. They worked - but I figured that it was possible to do it without the board if I did some tricky stuff with the ATMega interrupts on the Arduino. After a few days of debugging (and cycle counting) it’s working flawlessly. The advantage of this over a software serial based approach is that the Arduino acts as a buffer that’ll hold incoming messages (up to 128 bytes) until the NES is ready to get the next one. This means that the NES is free to do other things and doesn’t need to spend time polling the controller port! The latency is extremely low - about as fast as the NES could handle - faster than the MIDI standard. The serial code is compact and easily relocatable - it works great as a replacement to any controller code. Working on a new name for this since it really just acts like a bridge between your PC and the NES. Both the ROMs and the Arduino stuff will be open source so if you have the hardware you're ready to go!
PC->NES Transfer Tool features:
PRG Upload (2K max ($6000-$7FFF) - great for quickly debugging small programs)
CHR-RAM Uploader - CHR banks / nametable data
Full PPU control (palette / scroll registers / mirroring etc..)
Full sound register control
Demo video of PRG/PPU uploading. First the transfer tool is loaded from the powerpak - then glitchNES is uploaded over serial- then from there a couple of new CHR banks are loaded while glitchNES is running.
An NES Arduino Duemilanove or equivalent (testing RBBB this weekend - should be no problems) Desoldered NES controller cord (I have about 40 of these that I intended to use for the boards) Powerpak or other devcart (All software is currently using NROM (PRG-ROM + CHR-RAM) to make things simpler) Optional: MIDI-in circuit for Arduino for FaMI
- That’s it! No internal modification / extra components needed. It took a while to get the Arduino to handle everything but it was worth it to eliminate any external components. Just hook up the wires to the Arduino / run the software and pop that badboy into 2nd NES controller port.
And presenting...
FaMI (Family MIDI) - Open source NES MIDI software + live visualization by NO CARRIER
Right now channels 1-4 are working with no issues - MIDI files play perfectly (i just need to find the right song for a good demo)! There aren't any effects yet - but it’s completely stable / performance worthy in the state that it’s in. I'll be working on pitch bends / cc control in the next couple of weeks - but it's open source so hopefully people will develop beyond that! The samples work but they are fixed- I’m working on a mapper for powerpak right now that may allow sample uploading.
What’s great about using this Arduino setup is that you can use VBlanks MIDI->serial processing app so you don’t even need to build a MIDI circuit - just use the USB cable!
I’ll be releasing the source code for the Arduino/ROMs within the next week after I clean up the code/comment. I'm hoping to have a suite of audio/VJ tools that are ready to run so I’m looking for inspiration as to what else to use this stuff for! So please let me know if you have any ideas!
Thanks to + NO CARRIER for FaMI name / logo / layout + bucky for the encouragement / pitch tables + Animal Style / enso / entire Philly crew for being awesome dudes + neilbaldwin and blargg for inspiration to finish this NES stuff
Oh yeah I've got a bunch of desoldered controller cables (40+) - if you're going to pulsewave this weekend and have the hardware to try this out, let me know! I'll bring you one so you don't have to destroy a controller - free of charge - just help me test this stuff!