MML Editor

From ProjectWiki
Revision as of 08:18, 8 April 2010 by 74.132.200.196 (Talk)
Jump to: navigation, search

MML Editor

Contents

Project Status: Planning, method testing

What is this?

mmleditor work in progress

My objective is to create a simple yet powerful MML editor. I loved 3ML's simplicity but it did not support actual Macros nor did it support any midi control beyond patch changes and volume edits (which actually just adjusted the velocity). Some of my primary goals:

  • PianoRoll style display of MML, updated in real time with edits
  • Real time cursor displaying position within MML text during playback. like 3ML does, but since I am going to handle {a macros} as well will need some scheme easily display macros and loops
  • Full MIDI support
  • Compatibility with NDS_BGMMML driver for NDS
  • OpenSource from start
  • Cross platform compatible, able to run on mac, win, nix equally well

Need to keep it simple in first iteration else it will go the way of THDS and take me forever to complete. (This is sort of a spin off of that project, I need gamey music and MML seem best for style I desire). Later on i hope to provide support for multiple MML formats, various output modules, vst/i support, etc... but jaja.. KISS for now :D

Will need to add some additional commands to the MML spec. Need multiple arguments for macros (atm only takes $ for one, $1, $2 would work and still be compatible i believe), and a command and syntax for outputing raw midi data (such as "M0xf3,0x25,0x10" where 'M' would be the mml midi command, and '0xf3,0x225,0x10' would be the data to transmit). Expanding the macro definition specification in this way would allow for ANY MIDI note, controller, or command sequence to be defined and easily utilized within MML. Also, some way to indicate the time signature for proper displaying in the piano roll. (this may already exist).

Currently I am evaluating various options for the PianoRoll display. Have a working prototype (see image) that allows me to enter simplified MML so i can best determine how to handle the real time parsing/rendering.

Hope to have more updates soon!

PianoRoll

Wanted the Piano Roll (PR) to be somewhat modular and isolated from the sequencer portion, so it can be easily changed and improved without requiring much sequencer recoding. To attempt achieving it's objective the Piano Roll will be following specification:

Piano roll will consist of a QWidget that contains:

  • QImage where the events (notes) will be displayed
  • QScrollBar for horizontal and vertical scrolling the events within the widget's QImage
  • QButtons for zoom buttons

Additionally position indication in the form of timestamps, measure numbers etc, shall be rendered in the PR's QWidget right above the QImage, and an image of a piano keyboard will be visible along the left (scrolled and vertically aligned with the events inside the QImage).

See image.. ^_^ More things may be added later but for now a minimal interface will be created.

Piano roll displays based on ticks, it does not care about tempo (it does care about time signature however 3/4 4/4 etc). PR will assume 128 ticks per measure. Signals These signals should be sent or received from the PR:

update

Send to PR
update(from, to) - from, to indicating what range has changed

cursor

Send to PR
cursor(position) - moves cursor to given position, -1 indicates no cursor visible

=keyboard

Sent from PR
keyboard(note, KEYUP/KEYDOWN) - can be used by sequencer to sound note if piano roll keyboard or sequencer is clicked


requestEvents

Sent from PR (to sequencer) Request events from sequencer. This is the main means of interaction between PR and SEQ. When the PR needs information from the sequencer (in response to scrolling, zooming, other requests, etc...) it will send this signal indicating to the sequencer that it needs all events between (to,from) range. Events returned by the sequencer are in the form of an array (QVector) of tracks, of type TRACK, each track in list contains list (again QVector) of events.

requestEvents(from, to) - send to

Personal tools
irssi scripts
eggdrop scripts