Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions RhythmGameUtilities.Tests/MidiTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using System.IO;
using NUnit.Framework;

namespace RhythmGameUtilities.Tests
{

public class MidiTest
{

[Test]
public void TestReadMidiData()
{
var directory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
var path = Path.GetFullPath(Path.Combine(directory, "../../../Mocks/song.mid"));

var content = File.ReadAllBytes(path);

var notes = Midi.ReadMidiData(content);

Assert.That(notes.Length, Is.EqualTo(10));

Assert.That(notes[0].Position, Is.EqualTo(0));
Assert.That(notes[0].HandPosition, Is.EqualTo(48));

Assert.That(notes[1].Position, Is.EqualTo(480));
Assert.That(notes[1].HandPosition, Is.EqualTo(50));

Assert.That(notes[2].Position, Is.EqualTo(960));
Assert.That(notes[2].HandPosition, Is.EqualTo(52));

Assert.That(notes[3].Position, Is.EqualTo(1440));
Assert.That(notes[3].HandPosition, Is.EqualTo(54));

Assert.That(notes[4].Position, Is.EqualTo(1920));
Assert.That(notes[4].HandPosition, Is.EqualTo(56));

Assert.That(notes[5].Position, Is.EqualTo(2400));
Assert.That(notes[5].HandPosition, Is.EqualTo(48));

Assert.That(notes[6].Position, Is.EqualTo(2400));
Assert.That(notes[6].HandPosition, Is.EqualTo(50));

Assert.That(notes[7].Position, Is.EqualTo(2400));
Assert.That(notes[7].HandPosition, Is.EqualTo(52));

Assert.That(notes[8].Position, Is.EqualTo(2400));
Assert.That(notes[8].HandPosition, Is.EqualTo(54));

Assert.That(notes[9].Position, Is.EqualTo(2400));
Assert.That(notes[9].HandPosition, Is.EqualTo(56));
}

[Test]
public void TestReadMidiFile()
{
var directory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
var path = Path.GetFullPath(Path.Combine(directory, "../../../Mocks/song.mid"));

var notes = Midi.ReadMidiFile(path);

Assert.That(notes.Length, Is.EqualTo(10));

Assert.That(notes[0].Position, Is.EqualTo(0));
Assert.That(notes[0].HandPosition, Is.EqualTo(48));

Assert.That(notes[1].Position, Is.EqualTo(480));
Assert.That(notes[1].HandPosition, Is.EqualTo(50));

Assert.That(notes[2].Position, Is.EqualTo(960));
Assert.That(notes[2].HandPosition, Is.EqualTo(52));

Assert.That(notes[3].Position, Is.EqualTo(1440));
Assert.That(notes[3].HandPosition, Is.EqualTo(54));

Assert.That(notes[4].Position, Is.EqualTo(1920));
Assert.That(notes[4].HandPosition, Is.EqualTo(56));

Assert.That(notes[5].Position, Is.EqualTo(2400));
Assert.That(notes[5].HandPosition, Is.EqualTo(48));

Assert.That(notes[6].Position, Is.EqualTo(2400));
Assert.That(notes[6].HandPosition, Is.EqualTo(50));

Assert.That(notes[7].Position, Is.EqualTo(2400));
Assert.That(notes[7].HandPosition, Is.EqualTo(52));

Assert.That(notes[8].Position, Is.EqualTo(2400));
Assert.That(notes[8].HandPosition, Is.EqualTo(54));

Assert.That(notes[9].Position, Is.EqualTo(2400));
Assert.That(notes[9].HandPosition, Is.EqualTo(56));
}

}

}
Binary file added RhythmGameUtilities.Tests/Mocks/song.mid
Binary file not shown.
66 changes: 66 additions & 0 deletions RhythmGameUtilities/Scripts/Midi.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace RhythmGameUtilities
{

internal static class MidiInternal
{

[DllImport("libRhythmGameUtilities", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr ReadMidiDataInternal(byte[] bytes, int dataSize, out int size);

[DllImport("libRhythmGameUtilities", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr ReadMidiFileInternal(string filename, out int size);

}

public static class Midi
{

public static Note[] ReadMidiData(byte[] bytes)
{
var notes = new List<Note>();

var ptrArray = MidiInternal.ReadMidiDataInternal(bytes, bytes.Length, out var size);

var noteSize = Marshal.SizeOf(typeof(Note));

for (var i = 0; i < size; i += 1)
{
var noteSizePtr = new IntPtr(ptrArray.ToInt64() + noteSize * i);
var note = Marshal.PtrToStructure<Note>(noteSizePtr);

notes.Add(note);
}

Marshal.FreeHGlobal(ptrArray);

return notes.ToArray();
}

public static Note[] ReadMidiFile(string path)
{
var notes = new List<Note>();

var ptrArray = MidiInternal.ReadMidiFileInternal(path, out var size);

var noteSize = Marshal.SizeOf(typeof(Note));

for (var i = 0; i < size; i += 1)
{
var noteSizePtr = new IntPtr(ptrArray.ToInt64() + noteSize * i);
var note = Marshal.PtrToStructure<Note>(noteSizePtr);

notes.Add(note);
}

Marshal.FreeHGlobal(ptrArray);

return notes.ToArray();
}

}

}
96 changes: 96 additions & 0 deletions UnityPackage/Editor/Tests/MidiTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using System.IO;
using NUnit.Framework;

namespace RhythmGameUtilities.Tests
{

public class MidiTest
{

[Test]
public void TestReadMidiData()
{
var directory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
var path = Path.GetFullPath(Path.Combine(directory, "../../../Mocks/song.mid"));

var content = File.ReadAllBytes(path);

var notes = Midi.ReadMidiData(content);

Assert.That(notes.Length, Is.EqualTo(10));

Assert.That(notes[0].Position, Is.EqualTo(0));
Assert.That(notes[0].HandPosition, Is.EqualTo(48));

Assert.That(notes[1].Position, Is.EqualTo(480));
Assert.That(notes[1].HandPosition, Is.EqualTo(50));

Assert.That(notes[2].Position, Is.EqualTo(960));
Assert.That(notes[2].HandPosition, Is.EqualTo(52));

Assert.That(notes[3].Position, Is.EqualTo(1440));
Assert.That(notes[3].HandPosition, Is.EqualTo(54));

Assert.That(notes[4].Position, Is.EqualTo(1920));
Assert.That(notes[4].HandPosition, Is.EqualTo(56));

Assert.That(notes[5].Position, Is.EqualTo(2400));
Assert.That(notes[5].HandPosition, Is.EqualTo(48));

Assert.That(notes[6].Position, Is.EqualTo(2400));
Assert.That(notes[6].HandPosition, Is.EqualTo(50));

Assert.That(notes[7].Position, Is.EqualTo(2400));
Assert.That(notes[7].HandPosition, Is.EqualTo(52));

Assert.That(notes[8].Position, Is.EqualTo(2400));
Assert.That(notes[8].HandPosition, Is.EqualTo(54));

Assert.That(notes[9].Position, Is.EqualTo(2400));
Assert.That(notes[9].HandPosition, Is.EqualTo(56));
}

[Test]
public void TestReadMidiFile()
{
var directory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
var path = Path.GetFullPath(Path.Combine(directory, "../../../Mocks/song.mid"));

var notes = Midi.ReadMidiFile(path);

Assert.That(notes.Length, Is.EqualTo(10));

Assert.That(notes[0].Position, Is.EqualTo(0));
Assert.That(notes[0].HandPosition, Is.EqualTo(48));

Assert.That(notes[1].Position, Is.EqualTo(480));
Assert.That(notes[1].HandPosition, Is.EqualTo(50));

Assert.That(notes[2].Position, Is.EqualTo(960));
Assert.That(notes[2].HandPosition, Is.EqualTo(52));

Assert.That(notes[3].Position, Is.EqualTo(1440));
Assert.That(notes[3].HandPosition, Is.EqualTo(54));

Assert.That(notes[4].Position, Is.EqualTo(1920));
Assert.That(notes[4].HandPosition, Is.EqualTo(56));

Assert.That(notes[5].Position, Is.EqualTo(2400));
Assert.That(notes[5].HandPosition, Is.EqualTo(48));

Assert.That(notes[6].Position, Is.EqualTo(2400));
Assert.That(notes[6].HandPosition, Is.EqualTo(50));

Assert.That(notes[7].Position, Is.EqualTo(2400));
Assert.That(notes[7].HandPosition, Is.EqualTo(52));

Assert.That(notes[8].Position, Is.EqualTo(2400));
Assert.That(notes[8].HandPosition, Is.EqualTo(54));

Assert.That(notes[9].Position, Is.EqualTo(2400));
Assert.That(notes[9].HandPosition, Is.EqualTo(56));
}

}

}
2 changes: 2 additions & 0 deletions UnityPackage/Editor/Tests/MidiTest.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

66 changes: 66 additions & 0 deletions UnityPackage/Scripts/Midi.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace RhythmGameUtilities
{

internal static class MidiInternal
{

[DllImport("libRhythmGameUtilities", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr ReadMidiDataInternal(byte[] bytes, int dataSize, out int size);

[DllImport("libRhythmGameUtilities", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr ReadMidiFileInternal(string filename, out int size);

}

public static class Midi
{

public static Note[] ReadMidiData(byte[] bytes)
{
var notes = new List<Note>();

var ptrArray = MidiInternal.ReadMidiDataInternal(bytes, bytes.Length, out var size);

var noteSize = Marshal.SizeOf(typeof(Note));

for (var i = 0; i < size; i += 1)
{
var noteSizePtr = new IntPtr(ptrArray.ToInt64() + noteSize * i);
var note = Marshal.PtrToStructure<Note>(noteSizePtr);

notes.Add(note);
}

Marshal.FreeHGlobal(ptrArray);

return notes.ToArray();
}

public static Note[] ReadMidiFile(string path)
{
var notes = new List<Note>();

var ptrArray = MidiInternal.ReadMidiFileInternal(path, out var size);

var noteSize = Marshal.SizeOf(typeof(Note));

for (var i = 0; i < size; i += 1)
{
var noteSizePtr = new IntPtr(ptrArray.ToInt64() + noteSize * i);
var note = Marshal.PtrToStructure<Note>(noteSizePtr);

notes.Add(note);
}

Marshal.FreeHGlobal(ptrArray);

return notes.ToArray();
}

}

}
2 changes: 2 additions & 0 deletions UnityPackage/Scripts/Midi.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading