diff --git a/inc.lib/classes/MusicXML/Model/Note.php b/inc.lib/classes/MusicXML/Model/Note.php index f088e46..1c897ec 100644 --- a/inc.lib/classes/MusicXML/Model/Note.php +++ b/inc.lib/classes/MusicXML/Model/Note.php @@ -13,6 +13,22 @@ */ class Note extends MusicXMLWriter { + /** + * Default X + * + * @Attribute(name="default-x") + * @var float + */ + public $defaultX; + + /** + * Default Y + * + * @Attribute(name="default-y") + * @var float + */ + public $defaultY; + /** * Dynamics * diff --git a/inc.lib/classes/MusicXML/MusicXMLFromMidi.php b/inc.lib/classes/MusicXML/MusicXMLFromMidi.php index 283b456..0ba0f07 100644 --- a/inc.lib/classes/MusicXML/MusicXMLFromMidi.php +++ b/inc.lib/classes/MusicXML/MusicXMLFromMidi.php @@ -15,6 +15,7 @@ use MusicXML\Model\ScoreInstrument; use MusicXML\Model\ScorePart; use MusicXML\Model\ScorePartWise; +use MusicXML\Properties\Coordinate; use MusicXML\Properties\MidiEvent; use MusicXML\Properties\TimeSignature; @@ -913,7 +914,7 @@ private function getMeasure($partId, $channelId, $measureIndex, $timebase) $note0->type = $this->getNoteType($note0->duration, $divisions); $measure->note[] = $note0; - $measure = $this->addMeasureElement($measure, $noteMessages, $channelId, $divisions, $timebase); + $measure = $this->addMeasureElement($measureIndex, $measure, $noteMessages, $channelId, $divisions, $timebase); } // end add note @@ -930,6 +931,7 @@ private function getMeasure($partId, $channelId, $measureIndex, $timebase) /** * Add element to measure * + * @param integer $measureIndex * @param Measure $measure * @param array $noteMessages * @param integer $channelId @@ -937,7 +939,7 @@ private function getMeasure($partId, $channelId, $measureIndex, $timebase) * @param integer $timebase * @return Measure */ - private function addMeasureElement($measure, $noteMessages, $channelId, $divisions, $timebase) + private function addMeasureElement($measureIndex, $measure, $noteMessages, $channelId, $divisions, $timebase) { // TODO: if there are notes overlaped, make backup @@ -970,10 +972,31 @@ private function addMeasureElement($measure, $noteMessages, $channelId, $divisio } $note->duration = $duration; $note->type = $this->getNoteType($note->duration, $divisions); + + $coord = $this->getNoteCoordinate($measureIndex, $message, $divisions, $timebase); + $note->defaultX = $coord->defaultX; + $measure->note[] = $note; } return $measure; } + /** + * Get note coordinate + * + * @param integer $measureIndex + * @param array $message + * @param integer $divisions + * @param integer $timebase + * @return Coordinate + */ + private function getNoteCoordinate($measureIndex, $message, $divisions, $timebase) + { + $coordinate = new Coordinate(); + $timeRelative = $message['abstime'] - ($measureIndex * $timebase); + $coordinate->defaultX = ($timeRelative / $timebase) * $divisions; + return $coordinate; + } + } \ No newline at end of file diff --git a/inc.lib/classes/MusicXML/Properties/Coordinate.php b/inc.lib/classes/MusicXML/Properties/Coordinate.php new file mode 100644 index 0000000..13884fc --- /dev/null +++ b/inc.lib/classes/MusicXML/Properties/Coordinate.php @@ -0,0 +1,34 @@ +