|
|
|
@ -1,15 +1,21 @@ |
|
|
|
|
using System; |
|
|
|
|
using System.Collections.Generic; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Xml; |
|
|
|
|
|
|
|
|
|
using Melanchall.DryWetMidi.Smf; |
|
|
|
|
using Melanchall.DryWetMidi.Smf.Interaction; |
|
|
|
|
|
|
|
|
|
using SBRL.Utilities; |
|
|
|
|
|
|
|
|
|
namespace MusicBoxConverter |
|
|
|
|
{ |
|
|
|
|
public class MusicBoxScoreGenerator |
|
|
|
|
{ |
|
|
|
|
public float horizontalScaleFactor = 0.1f; |
|
|
|
|
public float verticalScaleFactor = 4f; |
|
|
|
|
public Vector2 offset { get; set; } = new Vector2(10, 10); |
|
|
|
|
public Vector2 scaleFactor { get; set; } = new Vector2(0.1f, 4f); |
|
|
|
|
|
|
|
|
|
public int holeSize { get; set; } = 5; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MidiFile midiFile; |
|
|
|
|
|
|
|
|
@ -22,24 +28,38 @@ namespace MusicBoxConverter |
|
|
|
|
{ |
|
|
|
|
SvgWriter svg = new SvgWriter(destinationFilename); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach(Note note in AllNotes()) |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("[{0}] {1}/{2}", note.Time, note.NoteName, note.NoteNumber); |
|
|
|
|
svg.WriteCircle( |
|
|
|
|
new Vector2( |
|
|
|
|
offset.X + note.Time * scaleFactor.X, |
|
|
|
|
offset.Y + note.NoteNumber * scaleFactor.Y |
|
|
|
|
), |
|
|
|
|
holeSize // radius |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
svg.Complete(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IEnumerable<Note> AllNotes() |
|
|
|
|
{ |
|
|
|
|
foreach(TrackChunk chunk in midiFile.Chunks.OfType<TrackChunk>()) |
|
|
|
|
{ |
|
|
|
|
using(NotesManager notesManager = new NotesManager(chunk.Events)) |
|
|
|
|
{ |
|
|
|
|
foreach(Note note in notesManager.Notes) |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("[{0}] {1}/{2}", note.Time, note.NoteName, note.NoteNumber); |
|
|
|
|
svg.WriteCircle( |
|
|
|
|
(int)(note.Time * horizontalScaleFactor), |
|
|
|
|
(int)(note.NoteNumber * verticalScaleFactor), |
|
|
|
|
5 |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
yield return note; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
svg.Complete(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public int TrackLength() |
|
|
|
|
{ |
|
|
|
|
//notesManager.Notes.OfType<TrackChunk>().Select((TrackChunk arg) => arg.Events.O; |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|