Playnoise Tracker


Month ago I received my Playdate!
After two days I started to tinker with SDK and finally started working on project I wanted to make for this device.
Playnoise Tracker is tracker (duh) music software for your Playdate.
It allows you to write songs using Playdate internal synths.
Currently it's in really early stage but it has basic workflow implemented.


  • Only 1 pattern
  • 64 steps per pattern
  • 4 tracks
  • You can edit only note and octave (velocity in the future, maybe some FX?)
  • No way to edit track settings => every track defaults to sine wave (I didn't implement UI yet)
  • No way to rename song (auto save is working, enabled by default)


D-pad moves cursor around windows, each A press goes one level down, B goes one level up.
Each window has a bit different layout that can be navigated using D-pad.
Crank can be used to move playhead, each time it encounters notes it will preview them.


Main panel:

Playnoise 2053-02-11 12.50.51
Some windows are not working (yet) but most important do. In the middle you can see two tracks side by side and edit notes in Track edit section.
In top-right corner you can find BPM setting of your song (120 by default).

Note edit

Playnoise 2053-02-11 13.18.39
Playnoise 2053-02-11 13.18.46


Playnoise 2053-02-11 13.19.28


Playnoise 2053-02-11 13.19.40
Playnoise 2053-02-11 13.19.12


  • Invert colors - set light or dark theme
  • Crank speed - crank can be used for song preview
  • Cursor speed - changes how quickly notes change when you hold up or down button
  • Autosave - if true then song will be autosaved on quit

Playnoise 2053-02-11 12.51.06


Playnoise 2053-02-11 12.51.15


I couldn't attach video but it's available on Google Drive: Playnoise Tracker.mkv - Google Drive
It's terrible tutorial but it's something :smiley:

Project uses amazing monospace font by @RobKohr (Monospace 5x8 font designed for "easy" readablity - #4 by DidierMalenfant)
It helped me a lot during UI development! (66.3 KB)


This looks awesome!! :heart_eyes:

1 Like

Looks great! Was thinking about this kind of tool on the Playdate and hoping someone would make one! :slight_smile:

I gave the attached pdx a try in the simulator (macOS), but unfortunately it crashes on launch for me with the following output in the console:

main.lua:13: attempt to index a nil value (global 'playnoise')
stack traceback:
main.lua:13: in main chunk

Let me know if there’s anything else I can gather to help debug. Really want to try this out!

Thanks @giezu, I was looking through and recognized my letters in the screenshot. Made me happy to see it there!

I just pushed up an update to the font here:

with some additional characters

and a double size version of the font.

1 Like

Interesting, it works fine on Windows!
It may be a bug in Simulator on Mac I believe?
I had Lua initialized before but it's disabled for now.
main.lua file is still in Source directory so project is still compiled as C+Lua project but Lua part is unused really.
Can you delete main.pdz file from Playnoise.pdx directory and check if it helped?
If yes it may be interesting bug to report to Panic team!

Hey, thanks for the update, it's very useful! I will use checkbox/checked box for sure, arrows and A-B buttons will help when (if?) I implement some kind of manual/tutorial!

No; that doesn’t quite do it — it’s still looking for that file. The new error is:

Couldn't find pdz file main.pdz

Hey, can you check that one? I totally removed any Lua reference. (34.3 KB)


No luck. Same error:

Couldn't find pdz file main.pdz

That's weird because that file is not generated when project is in plain C...
I don't know how Simulator on Mac works and can't test that unfortunately :confused:

Here is another version, with main.pdz. I hope Lua is not initialized because you will get crash every time you will use Menu Item, I described it in this thread: Using MenuItem added with C crashes if Lua runtime is enabled (55.6 KB)

So, this one does work but just launches into a blank screen.

Guessing that it’s just going into the Lua runtime / loop or whatever, and there’s nothing there since this is supposed to be a C-based project?

Ugh, it would be way easier to debug if I had Mac :smiley:
I guess yes, it's using lua update even if I'm setting C update with pd->system->setUpdateCallback...
Here is another version, inside Lua I'm calling C update (playnoise.update) but keep in mind that for 99% it will crash if you use one of custom side menu buttons :frowning: (56.2 KB)

Didn’t try this one yet, but have been wondering: are simulator builds even cross platform?

I know for sim builds on macOS it generates dylibs and other platform-specific stuff, and I hadn’t had luck sending my sim builds to Win/Linux users either.


Oh indeed, you are right! I forgot that Simulator doesn't load Playdate binary, it needs it compiled as library (dll/dylib/so). I guess we are out of luck then :confused:

loaded into my playdate and had a little mess about seems like a pretty cool start.. I use M8 tracker (small portable tracker, similar to LSDJ) as my main tracker for music making, and have some thoughts on how a tracker could control on playdate if you are interested.

That's sounds interesting, go ahead!

The basic idea would be the crank would be the main input but you would hold or A or B as a modifier. No button pressed crank will move you up or down steps, Hold A on a step and move the crank to change a note, Hold B and crank to make an area selection and select multiple notes in a sequence, double press B to Cut (this can double as a method of deleting), double press A to paste the last cut selection (generally you would cut and then paste something in the same place and then move to where you want to paste). Use Dpad to navigate, but you could also apply the same crank type navigation if you want more options with in a track, like left, right, or down might let you select filter, bitcush, fx send and crank the amount of each parameter but hold up and crank to move to different tracks or fx page.

This is very nice project and who I am to judge, I don't even have the console, but... I made a tracker in even worse conditions regarding screen resolution so I have a tiny bit of knowledge (?) Anyway, feel free to ignore my grumbling.

  1. Get yourself nice 5*8 pixels font, this one hurts my eyes. I can draw you one if you want.

  2. When drawing pattern editor, don't draw the cells for each pattern row, just make a 1 px verticsl spacing. Vertical lines between channels are ok btw. This would allow to place more rows on the screen at the same time which makes using the tracker much easier.

  3. Use 3*5 px tiny font for the places where you want to save even more screen space. I have an almost finished one, only numbers and uppercase letters though. You can check u8g2 library fonts, there should be some suitable ones for any pixel dimensions.

  4. I don't know what are the <0>... things on the left in note editor, but they also seem to waste some space. These are pattern selectors?

  5. BPM number is misleading for hardcore tracker enjoyers, you may place speed (how many ticks per pattern row) and rate (how many ticks per second, idk if in your tracker you can change this parameter) settings. You can still leave BPM counter but only as an informational one.

  6. Make a bottom line where one long line of text would be. Print some tips and hints there depending on where the user's "cursor" is. This would help newbies to get used to your tracker.

  7. Is this me or your tracker runs in halve the resolution? It's your business of course but you could place a lot more on the screen if in full resolution. Maybe a switch in settings so people with good vision could use the full screen resolution?

Okay that's all... And hey, I wanted to be the first for the tracker, but you were faster! Anyway, good luck, looks like my tracker isn't really possible on Playdate because there is no way to directly control the hardware, I am afraid :slight_smile:

In general idea sounds good, it would greatly utilize main feature of the console.

Unfortunately for me basing whole input on crank is no-go. Problem is the lack of tactile feedback from crank, it's harder to memorize and repeat common actions (note input, changing tracks etc) with this kind of input. Button press is tactile and you know it was pressed because you can feel it. When you turn the crank you can't really tell if it was enough degrees for note change or not.

I will consider some parts of your ideas tho, like setting parameters (fx send, filter, envelope) with a crank!

1 Like


I will go through each point:

  1. I picked that font because it's monospace and looks nicely (for me)! It really helped me with development and I have no plans to change it right now.

  2. I'm not quite sure what you mean by "just make 1px vertical spacing" but I don't think that would be give me enough space to have 16 rows per screen. Currently it divides nicely to 8 rows, while 16 would be ideal it's not really possible right now (because point 7)

  3. I didn't utilize whole screen yet so I don't feel like I need to save space, I will check them if needed :slight_smile:

  4. Yeah, it's not working yet but <0>, <1>, ..., are for switching patterns. 16 patterns per track should be enough based on my experience with hardware grooveboxes.

  5. Totally, it was just easier to expose BPM, currently it should be 16 rows per second with 120 BPM.

  6. That's a nice idea, before I was thinking only about demo songs with interactive tutorials (pop-ups).

  7. In the beginning I was using full resolution but I checked my program only in the simulator. After few days I checked it on device and decided to use half-res because everything was so unreadable. I may add resolution scaling in the future, that would require a bit of changes to how I'm creating windows and tables tho, but definitely doable.

You can still make it, it's not a race :smiley: development on this one will be really slow, it's just side project. I didn't really touch Playdate's sound API that much so it's hard to tell what's possible and what's not. First I will focus on synthesizers they (Panic!) provide and then I will think about other types of synthesis.