Git Product home page Git Product logo

midieditor's Introduction

MidiEditor

The original author have created a Github repository with all update. Please go to https://github.com/markusschwenk/midieditor


Linux Windows
Build Status Appveyor Build Status

Download : Windows last release

Building Dependencies

  • Qt >= 5.7
  • CMake >= 2.8.11
  • Linux :
    • sfml sudo apt-get install libsfml-dev
    • asound sudo apt-get install libasound2-dev
  • Windows Compiler : Works under Visual Studio >= 2013
  • Windows deployment : nsis

Introduction

MidiEditor is a free software providing an interface to edit, record, and play Midi data.

The editor is able to open existing Midi files and modify their content. New files can be created and the user can enter his own composition by either recording Midi data from a connected Midi device (e.g., a digital piano or a keyboard) or by manually creating new notes and other Midi events. The recorded data can be easily quantified and edited afterwards using MidiEditor.

image

Features

  • Easily edits, records and plays Midi files
  • can be connected to any Midi port (e.g., a digital piano or a synthesizer)
  • Tracks, channels and Midi events can be edited
  • Event quantization
  • Control changes can be visualized
  • Automatic Updates
  • Free
  • Available for Windows and Linux

Note

MidiEditor was developed by Markus Schwenk. It is entirely written in C++ (Qt) and is available for the platforms Linux and Windows. Should MidiEditor be a software which is helpful for you and which you use often, please let the developer and other users know by providing feedback. Moreover, the developer worked on MidiEditor in his (rare) sparetime and offers it for free. So, when you feel like it, pay him a coffee (or two). Please also feel free to contact the developer in case you have any ideas which could help to improve the editor or in the case you found any bugs you want the developer to fix.

Suggestion, Improvements, Bugreports...

Please feel free to contact the developer if you have any suggestions! Please also reach out to the developer if you found a bug.

Origin Project Page

Here you can find the original project page on sourceforge.net. You will find the code and a way to provide feedback.

Manual

Here

midieditor's People

Contributors

abreheret avatar easyaspi314 avatar hassanbouchiba avatar wohlstand avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

midieditor's Issues

MIDIs are corrupted on save for multiple reasons.

I notice a few reasons why MIDIs go corrupt, and some just seem to be random.
A corrupt MIDI will still edit fine while in MidiEditor if you keep it open. This is incredibly frustrating if

The first one is reproducible.

One thing that causes an issue is if the track name has unicode.

In this zip file below is two midis. It is the wild battle from Pokémon Emerald, dumped by Sappy.

Opening and saving the non-corrupt one causes a corrupt MIDI that freezes MidiEditor when it opens, the corrupt one being the output of simply a save as.

The track name for Track 0 is
"Song #474 - Battle - Wild Pokémon --- dumped by Sappy 2006 version 1.3"
but it displays and copy/pastes as
"Song #474 - Battle - Wild Pok�mon --- dumped by Sappy 2006 version 1.3"
with the "é" being a diamond with a question mark.

wild pokemon battle corrupt.zip

The second one is weird, and seems to be fixed by quantization of the file. I can't reliably reproduce this, but like I said, quantifying or however you spell it fixes it.

The next one is related to a second glitch.

Dragging control change events off the edge of the box can sometimes cause events to be on "negative ticks".
When you save and reopen it, events disappear.

There are more, with different effects. One removes a bunch of notes and sets the file duration to 0 ticks, but I have only encountered this so far with the version from the website. The other shows a dialog saying that the MIDI is corrupt.

[Progress] macOS support

I have an old MacBook running El Capitan (too old for Sierra, sadly).

I am going to do my best to make MidiEditor functional on macOS.

I managed to get the UI to build and run (see below), but CoreAudio doesn't seem to want to show up.
Fixed

screen shot 2017-09-02 at 11 05 13 pm

Roadmap:

  • Basic UI running.
  • MidiEditor.app packaging.
  • Midi Output – Needs setup.
  • Midi Input (can't test)
  • JACK audio as well as CoreMIDI? (Soundfonts?)
  • Native gestures/behaviors (especially smooth 360° scrolling, but I can't test multitouch zooming because my trackpad is the older kind).
  • Making it pretty. I have some progress, but it is definitely going to need some work.

Non-note events selected + Drag velocities up/down = Crash

If any non-note events are selected, such as control change points, and in the Velocity panel, the bars are dragged up or down, MidiEditor crashes, and you lose all of your work.

The easiest way to reproduce this is to press Ctrl+A, assuming you have control/program change events in the channel(s).

I get a segfault, with the debugger pointing to NoteOnEvent.cpp, line 41.

I think that a simple check to see if it is a note before attempting to change the velocity would fix this.

Please allow rebinding the keyboard shortcuts to something else

The draw note tool and the select note tool... The two tools that are almost certainly used more frequently than any other tools, and that need to be used in constant alternation (because it's not possible to select an existing note with the draw tool enabled), have hardcoded keyboard shortcuts at opposite ends of the keyboard!

Repetitive. Strain. Injury.

I don't care if there's even a UI for it, setting them via a config file would be fine!

I'll be redoing these shortcuts to something somewhat less wrist-destroying in my own fork (with no attempt made to make it configurable).

Shortcut to pan the view

Hello,

First all, I wanted to say you did a really great job with this project, congratulation! 👍

I'm starting to use regularly, but some features would be great to improve the productivity, and it's really frustrating to not be able to do something that you would like.

It's the case of panning, I don't know if it's already implemented yet, but for most software today, you can pan the view using the middle mouse click button or a combination of CTRL, ALT, SHIFT keys + middle button. Here, it seems that it places a new note.

Is there another shortcut to do what I would like?

Notes that start and end on the same tick and note become merged.

Hi, I know this hasn't been updated in a while, but I am going to leave a few bug reports anyways, as you are more active than the original creator. Sorry about that.

I use MidiEditor to edit Pokémon Gen III music for ROM hacks. It only has 24 PPQ resolution, so what often happens is that notes start and end on the same note and tick.

So, note 1 is a Middle C that starts on tick 0 and ends on tick 24, and note 2 is also a Middle C and starts on tick 24 and ends on tick 48.

One thing that happens is that occasionally on save, the notes will merge.

Instead of them both being 24 ticks long, note 1 will be 48 ticks long, and note 2 would be 0 ticks long, overlapping.

I use VirtualMIDISynth and it plays fine from MidiEditor, oddly, but it still causes issues. Changing them back and saving again rarely fixes this, and because of the low resolution, making both notes 23 ticks instead of 24 makes a noticeable difference when played in-game.

If editing existing MIDIs, and the notes starting and ending on the same note is in the file, but the notes are not edited, that doesn't happen. It only seems to be if the notes are edited or added directly.

Apparent race condition causes the screen to go blank.

midieditor_blank_screen

Here's the application output

QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setRenderHint: Painter must be active to set rendering hints
QPainter::font: Painter not active
QPainter::setFont: Painter not active
QPainter::setClipping: Painter not active, state will be reset by begin
QPainter::setClipping: Painter not active, state will be reset by begin
QPainter::setClipRect: Painter not active
QPainter::setPen: Painter not active
...Spam, Spam, Spam, eggs and Spam.

I had zoomed in fairly close to select a control change 1 tick after the previous. I selected it, but as soon as I clicked off, the screen went blank. I have had this happen on the original MidiEditor as well. However, I can't seem to reproduce it.

A side note: We really need a way to select overlapping events. Maybe something similar to the link zoom on Chrome for Android.

Dragging or selecting notes sometimes causes notes to change timing.

If I select items, unless my mouse movement is very steady, I often have events change their duration or move. There should be a threshold to mouse movement, and/or a "don't drag and select at the same time" or whatever you want to call it option.

Additionally, if I drag events, it sometimes causes timing to change. This seems to only happen with the Magnet enabled and it snaps. It snaps to the wrong tick, and the timings get all messed up.

Again, this is more noticeable on low-res files.

Edit: "Dragging or selecting notes sometimes causes notes to sometimes change timing." Very grammar. :P

Transition to QGraphicsView.

Lovely. All this work we put in and there were classes that did the things we needed it to all along.

QGraphicsView and QGraphicsScene

The QGraphicsView class provides a widget for displaying the contents of a QGraphicsScene.
The QGraphicsScene class provides a surface for managing a large number of 2D graphical items.

QGraphicsView inherits QAbstractScrollArea and has options for avoiding repaints and such, and QGraphicsScene has item holders, caches, adding rects, selections, and grouping.

Additionally, QAbstractScrollArea::setViewportMargins() would be helpful, as long as we can figure out what they mean by putting widgets inside the margins.

We need to transition to this, unfortunately, if we ever plan to progress past this repainting hell which, as I found out, is still happening even after my optimizations.

I am working on it as we speak.

  • Basic visuals
  • Selection (partial, built-in feature)
  • Moving and Snapping
  • Antialiasing
  • Creation/Deletion
  • Hiding/showing layers
  • Per channel/per track colors
  • Syncing changes with MidiFile
  • Convert MiscWidget as well

Feature request (partially implemented): Drag mouse vertically to set velocity with New Note tool

mouse velocity

My partial implementation is above.

Most of it works, I have the repositioning down, the tooltip (which is drawn manually because normal QToolTips have a few issues I don't like), seems to work aside from a bit of margin-al (couldn't resist) errors. I'd like to have it lock the length of the note if you hold shift so you don't reposition accidentally.

The only major issue with my implementation so far is that if you drag out, it cancels.

Do you like this idea? Or should it be, say, the scroll wheel like GarageBand's score editor?

I can push my changes once I clean them up to another branch.

UI Simplification/Small Screen Optimizations

One of the issues I am running into in making it macOS compatible is the simplicity.

macOS has a strong focus on simplicity and intuition in their guidelines:

"People expect macOS apps to be intuitive, while at the same time being adaptable to their workflow needs through customization and flexibility." – macOS Human Interface Guidelines

Microsoft says a similar thing:

"A great desktop application is powerful and, at the same time, simple." – Windows Design Principles

GNOME also agrees:

"…[O]nly include essential controls and information in your application interface.
When adding a new control or piece of information, always take a moment to question whether it is necessary." – GNOME Design Principles

Xcode is one of my favorite examples of the "powerful yet simple" concept:
screen shot 2017-09-29 at 9 13 56 am

It is one of the few IDEs that still looks good and doesn't ever feel cramped or cluttered on my 13.3" screen, unlike some of the other ones. (Not giving any names)

MidiEditor is somewhat complicated and takes a long time to learn. Not as complicated as, say, Anvil Studio, but it still has a learning curve.

midieditor marked
Here, I marked what is important and extremely unimportant.

This could be simplified a lot. The play and pause button could automatically switch, we don't need most of those buttons, and if we have to, the tools could be a panel or a drop-down.

One of the things I like to do is design for the smallest screens found today: About 1024x600, netbook size. (800x600 is pretty much obsolete; we don't need to support it)
screen shot 2017-09-29 at 9 40 26 am

MidiEditor does not look good in my Mac's smallest resolution, 1024x600, with the Menu Bar and Dock showing.

The area allowed for the canvas is about 25% of the window (excluding the titlebar); which is hardly usable.

screen shot 2017-09-29 at 9 46 02 am
Compare this to Xcode which, while a little cramped, is still very usable.

Obviously, this is a long-term goal.

I really wish we could get Markus here.

Program changes on the same tick often play previous instrument.

Again, this is mostly an issue with low-res MIDIs.

Occasionally, depending on the file, if you have a Program Change event on the same tick that a note starts on, the previous instrument will play. So, if I change from String Ensemble 1 to Acoustic Grand Piano on tick 48 and have a note that also starts on tick 48, the note tends to play in strings instead of piano.

This also happens on the beginning of the song. If I continued said example, and played it to a tick after 48, then played the song from the beginning, the first note would often play in piano instead of strings. However, stopping playback before a second program change seems to be a workaround.

I notice that program changes, control changes, labels, etc., are always put a tick early:
If I enable snapping and right click to put my program change event at tick 96, as soon as I let go, the event will move to tick 95. This can be mildly annoying, especially when manually adding volume changes.

Dragging control changes off the edge of the grid causes invalid values.

Dragging control change handles on the visual graph off the edge of the visual grid can sometimes cause negative ticks if you drag it too far to the left at the beginning of the file, or cause invalid values if you drag above or below the top/bottom.

If I do the former, like I said, it displays as a negative value in On Tick.
The latter sets the Value parameter to blank.

This can cause various weird and unpredictable effects.

When pausing and playing after a control change, the previous value is used.

Last bug and I'll shut up.

Let's say you stop playback after a control change. Let's use volume for simplicity.

If you stop playback after the volume change and start at a part where there is no change in volume, that previous volume will play until another volume change event is encountered.

Let's say I have three volume control events. One at tick 0 that is 127, one at tick 96 that is 64, and one at tick 192 that is 10. If I put the cursor at tick 20, play the song and pause at tick 200, then play (assuming there is a note at tick 24), the note will play at volume 10 until tick 64, where it will jump to 64.

I get this with both VirtualMIDISynth and Microsoft GS Wavetable Synth.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.