Sega Master System / Mark III / Game Gear
SG-1000 / SC-3000 / SF-7000 / OMV
Home - Forums - Games - Scans - Maps - Cheats - Credits
Music - Videos - Development - Hacks - Translations - Homebrew

View topic - [Coding competition 2020] VU by sverx

Reply to topic
Author Message
  • Site Admin
  • Joined: 08 Jul 2001
  • Posts: 8177
  • Location: Paris, France
Reply with quote
[Coding competition 2020] VU by sverx
Post Posted: Tue Mar 24, 2020 8:08 pm

(preamble) This has been quite rushed at the end as I didn't find enough time to improve it, but improvement is surely possible.

So here's *VU*: a standalone PSG player with VU meter display. Uses PSGlib of course. Source code included too.

The interesting part of the code is surely the routine that draws the 4 needles on screen using sprites.

This is done using the Integer Line Algorithm [ ] to calculate which of 8 possible pre-loaded sprites should be used for each 8-pixel tall segment of the line, and the current implementation works only for those lines going from y0<y1 (going down on the screen) and with sharp angle only - that is, when the line will need at most one pixel per horizontal line.

As the current algorithm doesn't take into account on which lines the x position of the pixel should be incremented but only how many times we need to do that, the line isn't always drawn perfectly, but it's close enough after all.
Another limit is that the line might be drawn 'past' the destination point (x1,y1) as all the sprites contain line segments that are 8 pixels tall, so I had to mask that part of the line that I didn't want to show using black sprites strategically placed. Hey, it's a hack, of course!

From the VU perspective, for each channel the algorithm adds the volume of the last 17 samples (because 17*15=255 so I can always sum 17 values into a byte) and the resulting value is then shown by the needle (which has only 68 possible positions anyway, so it's scaled down of course).

17 samples at 60 fps take 283 ms which is almost 300 ms, the rise time expected by real VU meters, so the effect should look quite accurate too (18 samples would make that perfect, but would require ints instead of chars...)

Compiling the code creates a 16 KB ROM (complete with correct SEGA ROM signature). At this point, you can concatenate your PSG file to this ROM and send it to who you want (the PSG file limit is 32 KB).

on Windows: copy VU.sms+YourTune.psg YourROM.sms

on Linux: cat VU.SMS YourTune.psg > YourROM.SMS

VU.SMS is also provided, you don't need to recompile it if you're not planning any change.

Finally, two *GREAT* tunes ROM are included for your enjoyment:

- Z80HEARTONFIRE.SMS plays "Z80 HEART ON FIRE" by Polaria Poyon (used by permission)
- OUTRUNTUNE.SMS plays my favorite tune from OutRun (fair use, I guess...)

Also, for those using a Master EverDrive, the OS *should* load the file correctly from SD card even if the file size isn't rounded to any particular multiple/power size, as it's less than 64 KB, so you shouldn't need to pad your file. I can't test this myself at the moment, unfortunately.

I hope you'll enjoy this!
See you later :)


  View user's profile Send private message Visit poster's website
  • Joined: 05 Sep 2013
  • Posts: 2622
Reply with quote
Post Posted: Today at 3:19 pm
first patch already (forgot to clear VRAM PNT!!! :( )

[VU 1.01 attached] (6.48 KB)
VU v.1.01

  View user's profile Send private message Visit poster's website
Reply to topic

Back to the top of this page

Back to SMS Power!