/** * Reads a mesure header * * @param integer $number * @param Song $song * @param TimeSignature $timeSignature * @param integer $tempoValue * * @return MeasureHeader */ public function readMeasureHeader($number, Song $song, TimeSignature $timeSignature, $tempoValue = 120) { $flags = $this->reader->readUnsignedByte(); $header = new MeasureHeader(); $header->setNumber($number); $header->setStart(0); $header->getTempo()->setValue($tempoValue); $header->setTripletFeel($this->reader->getTripletFeel()); $header->setRepeatOpen(($flags & 0x4) != 0); if (($flags & 0x1) != 0) { $timeSignature->setNumerator($this->reader->readByte()); } if (($flags & 0x2) != 0) { $timeSignature->getDenominator()->setValue($this->reader->readByte()); } $header->getTimeSignature()->copyFrom($timeSignature); if (($flags & 0x8) != 0) { $header->setRepeatClose($this->reader->readByte()); } if (($flags & 0x10) != 0) { $header->setRepeatAlternative($this->reader->factory('GuitarPro3RepeatAlternative')->parseRepeatAlternative($song, $number)); } if (($flags & 0x20) != 0) { $header->setMarker($this->reader->factory('GuitarProMarker')->readMarker($number)); } if (($flags & 0x40) != 0) { $this->reader->setKeySignature($this->reader->factory('GuitarProKeySignature')->readKeySignature()); $this->reader->skip(1); } return $header; }
/** * Reads a mesure header * * @param integer $number * @param Song $song * @param TimeSignature $timeSignature * @param integer $tempoValue * * @return MeasureHeader */ public function readMeasureHeader($index, TimeSignature $timeSignature, $tempoValue = 120) { $flags = $this->reader->readUnsignedByte(); $header = new MeasureHeader(); $header->setNumber($index + 1); $header->setStart(0); $header->getTempo()->setValue($tempoValue); $header->setRepeatOpen(($flags & 0x4) != 0); if (($flags & 0x1) != 0) { $timeSignature->setNumerator($this->reader->readByte()); } if (($flags & 0x2) != 0) { $timeSignature->getDenominator()->setValue($this->reader->readByte()); } $header->getTimeSignature()->copyFrom($timeSignature); if (($flags & 0x8) != 0) { $header->setRepeatClose(($this->reader->readByte() & 0xff) - 1); } if (($flags & 0x20) != 0) { $header->setMarker($this->reader->factory('GuitarProMarker')->readMarker($header->getNumber())); } if (($flags & 0x10) != 0) { $header->setRepeatAlternative($this->reader->readUnsignedByte()); } if (($flags & 0x40) != 0) { $this->reader->setKeySignature($this->reader->factory('GuitarProKeySignature')->readKeySignature()); $this->reader->skip(1); } if (($flags & 0x1) != 0 || ($flags & 0x2) != 0) { $this->reader->skip(4); } if (($flags & 0x10) == 0) { $this->reader->skip(1); } $tripletFeel = $this->reader->readByte(); if ($tripletFeel == 1) { $header->setTripletFeel(MeasureHeader::TRIPLET_FEEL_EIGHTH); } else { if ($tripletFeel == 2) { $header->setTripletFeel(MeasureHeader::TRIPLET_FEEL_SIXTEENTH); } else { $header->setTripletFeel(MeasureHeader::TRIPLET_FEEL_NONE); } } return $header; }
private function writeMeasureHeader(MeasureHeader $measure, TimeSignature $timeSignature) { $flags = 0; if ($measure->getNumber() == 1 || $measure->getTimeSignature()->getNumerator() != $timeSignature->getNumerator()) { $flags |= 0x1; } if ($measure->getNumber() == 1 || $measure->getTimeSignature()->getDenominator()->getValue() != $timeSignature->getDenominator()->getValue()) { $flags |= 0x2; } if ($measure->isRepeatOpen()) { $flags |= 0x4; } if ($measure->getRepeatClose() > 0) { $flags |= 0x8; } if ($measure->hasMarker()) { $flags |= 0x20; } $this->writeUnsignedByte($flags); if (($flags & 0x1) != 0) { $this->writeByte($measure->getTimeSignature()->getNumerator()); } if (($flags & 0x2) != 0) { $this->writeByte($measure->getTimeSignature()->getDenominator()->getValue()); } if (($flags & 0x8) != 0) { $this->writeByte($measure->getRepeatClose()); } if (($flags & 0x20) != 0) { $this->writeMarker($measure->getMarker()); } }
private function parseTimeSignature($tick, array $data) { if (count($data) >= 2) { $timeSignature = new TimeSignature(); $timeSignature->setNumerator($data[0]); $timeSignature->getDenominator()->setValue(Duration::QUARTER); if ($data[1] == 0) { $timeSignature->getDenominator()->setValue(Duration::WHOLE); } else { if ($data[1] == 1) { $timeSignature->getDenominator()->setValue(Duration::HALF); } else { if ($data[1] == 2) { $timeSignature->getDenominator()->setValue(Duration::QUARTER); } else { if ($data[1] == 3) { $timeSignature->getDenominator()->setValue(Duration::EIGHTH); } else { if ($data[1] == 4) { $timeSignature->getDenominator()->setValue(Duration::SIXTEENTH); } else { if ($data[1] == 5) { $timeSignature->getDenominator()->setValue(Duration::THIRTY_SECOND); } } } } } } $this->getHeader($tick)->setTimeSignature($timeSignature); } }
private function makeEighthNoteBytes(TimeSignature $timeSignature) { $bytes = array(0, 0, 0, 0); if ($timeSignature->getDenominator()->getValue() <= Duration::EIGHTH) { $eighthsInDenominator = intval(Duration::EIGHTH / $timeSignature->getDenominator()->getValue()); $total = $eighthsInDenominator * $timeSignature->getNumerator(); $byteValue = intval($total / 4); $missingValue = $total - 4 * $byteValue; for ($i = 0; $i < count($bytes); $i++) { $bytes[$i] = $byteValue; } if ($missingValue > 0) { $bytes[0] += $missingValue; } } return $bytes; }
public static function timeSignature(TimeSignature $timeSignature) { $message = new MidiMessage(MidiMessage::TYPE_META, MidiMessage::TIME_SIGNATURE_CHANGE); $message->setData(array($timeSignature->getNumerator(), $timeSignature->getDenominator()->getIndex(), 96 / $timeSignature->getDenominator()->getValue(), 8)); return $message; }