LoginLogin
Might make SBS readonly: thread

Litterbox - MML Tracker

Root / Submissions / [.]

glennxsergeCreated:
Download:NDKJR3X3
Version:Size:1MB
A proper MML Tracker. Features include:
  • Create and manage projects
  • Restore project from last application state if program was terminated without saving (Start button is pushed)
  • Pattern editor for organizing song parts
  • Channel muting/isolation
  • Instrument selection
  • FX Editors for adjusting Volume,Pan,Detune,Gate, and Modulation
  • ADSR Envelope for adjusting instrument amplitude
  • Playback MML in realtime
  • Export MML files
  • And more to come!
As this is the V 1.00 release, it is functionally complete, but I do plan on updating to add additional tools, such as copying and pasting notes, and importing external MML data. Feedback is welcome, and if you find bugs or errors, please leave a comment detailing the issue. Happy composing! EDIT: V 1.03 Update - Fixed sort function for high note positions that set the signed bit, which compared negative and cause high values to get sorted below smaller ones. Results in starting note requiring lots of leading rests during playback or export. Old songs should be fine, it was just a playback issue. - Full optimization pass on rendering process to make this usable on the original 3DS - Better instructions for most modes - Fixed bug when creating notes outside measure, when the length is shorter than the standard grid size - Notes, during edit mode, now sound in accordance with the FX before them. For instance, if a note is selected, and the previous note had a pan effect, that note will playback in the editor with the pan effect. - Fixed various visual bugs relating to optimizations EDIT: V 1.02 Update - Some cosmetic fixes to interface - Fixed pattern bug: subscript error when not all pattern numbers are used - Fixed note hopping near end of measures: increased the maximum note position by 16 times. - Time signature limited to practical values, in conjunction with expanded measure amount (from 8 -> 20 measures) - Added Custom 1 instrument, so default can be used as an instrument - Added loop point in song, now you can specify where the song repeats to once it's reached the end. In the pattern editor the 'X' button will set the active pattern to be the loop point. - Pattern playback timer is now much more accurate, fixed a precision rounding error. - Pattern playback in song mode now plays from the pattern currently being edited, and will loop back to that pattern at the end unless a loop point has been set after it. - Bug fixed in MML generation relating to notes outside pattern measure range. - General maintenance and cleanup EDIT: V 1.01 Update Optimizations - removed excessive draw operations. Hopefully this results in better usability for original 3DS users. Fixed sprite bug in ASDR and FX modes. Added 'hidden' instruments - 144-151 Fixed timer during playback, so it is tied to MAINCNT

Instructions:

General instructions for each application mode are listed on the top screen for reference. Most inputs have a secondary behavior when the L or R shoulder buttons are held. Touch Input
  • Touch anywhere in the note editor window to create or select notes
  • Touch the colored pills on the left side of the screen to select a channel to author notes in. Holding L/R will open the instrument selection mode for that channel.
  • Touch the 'M' symbol on the left side of the screen to mute that channel. Holding L/R will mute all other channels.
Face Buttons
  • A (+L/R) - Select next (previous) note
  • B (+L/R) - Convert note to triplet (Portamento: slide pitch)
  • X (+L/R) - Play current pattern (song)
  • Y (+L/R) - Delete note (channel, must hold L/R for at least half a second)
Directional Pad
  • Dpad U (+L/R) - Move note up a semitone (octave)
  • Dpad D (+L/R) - Move note down a semitone (octave)
  • Dpad L (+L/R) - Move note backwards (shorten note)
  • Dpad R (+L/R) - Move note forward (lengthen note)
Stick
  • Stick U (+L/R) - Scroll editor view up (2x speed)
  • Stick D (+L/R) - Scroll editor view down (2x speed)
  • Stick L (+L/R) - Scroll editor view back (2x speed)
  • Stick R (+L/R) - Scroll editor view forward (2x speed)

It even has an autosave feature? Neat Edit seriously though this is really amazing and polished

Replying to:jamieyello
It even has an autosave feature? Neat Edit seriously though this is really amazing and polished
Yeppers, when you boot up the program there is a restore button at the bottom if it finds a backup. The application stores all the needed persistent song data in the prg slots, so it survives program termination and can be retrieved later. EDIT: But to be clear, it's a fail-safe, it's a better idea to actually use the Save button in the application

Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
Oh it's unoptimized on O3DS? Darn, I'll have to wait and try this. This is one of the few SB programs I've actually been anticipating. It looks fantastic though! I was expecting something more like FastTracker II or Famitracker but this I think is more fitting for the nature of MML itself. Can you even call this a tracker? If you need any help optimizing it for O3DS I can get your back.

This looks well rounded!

Looks beautiful...

This looks sweet! I've been using NCF-Museq, but this looks like an improvement over that! Does it support portamento (_) or note connections (&) by chance? That's the main thing missing in NCF-Museq that I want to work with.

Replying to:mystman12
This looks sweet! I've been using NCF-Museq, but this looks like an improvement over that! Does it support portamento (_) or note connections (&) by chance? That's the main thing missing in NCF-Museq that I want to work with.
Oh yeah, definitely not working on O3DS! It's flickering like crazy!

Replying to:mystman12
This looks sweet! I've been using NCF-Museq, but this looks like an improvement over that! Does it support portamento (_) or note connections (&) by chance? That's the main thing missing in NCF-Museq that I want to work with.
Is it slow or just really flickery? Depends on how much optimizing he might need

Needs more cowbell! Can't wait to have an o3ds optimized version! This is going to be one handy tool!

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
Hi Raimondz, I've only used this on my N3DS, so I'm unaware of such problems. I'll look into the gpage issue, but I might need feedback from O3DS users. Thanks for pointing the issue out!

Replying to:mystman12
This looks sweet! I've been using NCF-Museq, but this looks like an improvement over that! Does it support portamento (_) or note connections (&) by chance? That's the main thing missing in NCF-Museq that I want to work with.
Mystman12, it supports '_' for portamento connections, and '&' for automatically tieing notes that cross beat boundaries

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
Depends on how your code is written, but I could probably give you a gpage buffer in 5 minutes. It's very easy and lightweight and should remove the flicker. Making it run any faster is more of a challenge.

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
Hi slackerSnail, if you can give me an example of where that's used, I'm sure I can patch it in quickly tonight. There are plenty of other areas I can optimize as well in how the interface is drawn, I just didn't realize it was a problem until now. Sorry to all the O3DS users (>_<)

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
Basically here's the problem, you go into the application after making a project, and flicker galore; I can't do anything. :P I'll probably watch this page to see when this is fixed, because it looks impressive; oh boo us O3DS users

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
In essence, you use two GRP pages instead of one: one page is the drawing page and the other is the display page. These pages switch places at the end of every scene draw. The previous frame is on screen as you draw the next one, and then you switch their places. The drawing page always gets overwritten so you'll never have any old frames hanging around. This is analogous to page-flip double buffering in modern graphics like OpenGL and eliminates virtually all display artifacts if VSYNCed. While this won't fix any speed issues, you won't have any flickering. I would recommend you ALWAYS set up a buffer system like this, even if you're targeting n3ds. I couldn't exactly tell you how to put it in your code because I haven't seen it yet. But here's a simple example.
'init
VAR BD%=0 'display page
VAR BB%=2 'buffer page
GPAGE BD%,BB%

WHILE #TRUE
 VSYNC
 GCLS RND(16777216)+#BLACK 'fill screen with random color
 SWAP BD%,BB% 'swap pages
 GPAGE BD%,BB%
WEND

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
Thanks slackerSnail, that's crystal clear. I remember using double buffering (and quadbuffering for 3d displays) in other languages, so your explanation makes sense. However, the GPAGE command is a bit odd to me. It seems like it relates strictly to the graphics page. Are the BG and Sprite layers folded into the graphics page at that point? Or will I need to swap those individually as well? Right now I'm using all 6 pages (3 on top, 3 on bottom) for drawing the UI, however, both the BG and Sprite layers use the same tile set, so I could save a page by setting the BG and Sprites to the same one. The top screen I can optimize enough by only drawing it once at the beginning of a application state change as the information is static (outside of the timer during playback). Between those two things, I think I can cut down quite a bit of churn. The actual application data processing should be fairly inexpensive (just iterating over some arrays, and bitfield masking, etc..), but I'll run some timing tests to double check that I'm not wasting cycles there. Thanks again for your help.

Very nice! This is just what I was looking for. Now I don't have to develop one for myself! Thank you! :D

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
Do you do a lot of redrawing on the BG and sprite pages? I was under the impression that the flicker was just from redrawing a lot of GRP graphics on screen. EDIT: NOW that I run it, I notice you're redrawing pretty much everything per frame. That's not something you should do. Much of this UI could be either drawn only when you need to change it, or be sprites or BG layer objects. You may need to do a lot of rewrites to the way you do the GUI.

Replying to:raimondz
Hi, I tried to use it on my O3DS but it doesn't work well. You forgot to use gpage before and after rendering the gui to draw everything in one step.
Very little is drawn to the graphics page, just some text on the top screen, where the console print doesn't give the pixel precision placement I needed. On the bottom screen I draw a line timeline during playback, and I think that's about it. However, I am setting the BG and Sprites on every frame, and I plan on optimizing that with dirty flags that only draw when specific things change.