예제 #1
0
 /**
  * Reads Channel informations
  * 
  * @param Song $song
  * @param Track $track
  * @param array $channels
  */
 public function readChannel(Song $song, Track $track, $channels)
 {
     $gChannel1 = $this->reader->readInt() - 1;
     $gChannel2 = $this->reader->readInt() - 1;
     if ($gChannel1 >= 0 && $gChannel1 < count($channels)) {
         $channel = new Channel();
         $gChannel1Param = new ChannelParameter();
         $gChannel2Param = new ChannelParameter();
         $gChannel1Param->setKey("channel-1");
         $gChannel1Param->setValue("{$gChannel1}");
         $gChannel2Param->setKey("channel-2");
         $gChannel2Param->setValue($gChannel1 != 9 ? "{$gChannel2}" : "{$gChannel1}");
         $channel->copyFrom($channels[$gChannel1]);
         for ($i = 0; $i < $song->countChannels(); $i++) {
             $channelAux = $song->getChannel($i);
             for ($n = 0; $n < $channelAux->countParameters(); $n++) {
                 $channelParameter = $channelAux->getParameter($n);
                 if ($channelParameter->getKey() == "{$gChannel1}") {
                     if ("{$gChannel1}" == $channelParameter->getValue()) {
                         $channel->setChannelId($channelAux->getChannelId());
                     }
                 }
             }
         }
         if ($channel->getChannelId() <= 0) {
             $channel->setChannelId($song->countChannels() + 1);
             $channel->setName($this->createChannelNameFromProgram($song, $channel));
             $channel->addParameter($gChannel1Param);
             $channel->addParameter($gChannel2Param);
             $song->addChannel($channel);
         }
         $track->setChannelId($channel->getChannelId());
     }
 }
예제 #2
0
 private function makeChannel(MidiSequenceHelper $sHelper, Channel $channel, $track)
 {
     if (($this->flags & MidiWriter::ADD_MIXER_MESSAGES) != 0) {
         $channelId = $channel->getChannelId();
         $tick = $this->getTick(Duration::QUARTER_TIME);
         $sHelper->getSequence()->addControlChange($tick, $track, $channelId, MidiWriter::VOLUME, $this->fix($channel->getVolume()));
         $sHelper->getSequence()->addControlChange($tick, $track, $channelId, MidiWriter::BALANCE, $this->fix($channel->getBalance()));
         $sHelper->getSequence()->addControlChange($tick, $track, $channelId, MidiWriter::CHORUS, $this->fix($channel->getChorus()));
         $sHelper->getSequence()->addControlChange($tick, $track, $channelId, MidiWriter::REVERB, $this->fix($channel->getReverb()));
         $sHelper->getSequence()->addControlChange($tick, $track, $channelId, MidiWriter::PHASER, $this->fix($channel->getPhaser()));
         $sHelper->getSequence()->addControlChange($tick, $track, $channelId, MidiWriter::TREMOLO, $this->fix($channel->getTremolo()));
         $sHelper->getSequence()->addControlChange($tick, $track, $channelId, MidiWriter::EXPRESSION, 127);
         if (!$channel->isPercussionChannel()) {
             $sHelper->getSequence()->addControlChange($tick, $track, $channelId, MidiWriter::BANK_SELECT, $this->fix($channel->getBank()));
         }
         $sHelper->getSequence()->addProgramChange($tick, $track, $channelId, $this->fix($channel->getProgram()));
     }
 }
예제 #3
0
 private function checkChannels()
 {
     for ($tc = 0; $tc < count($this->tempChannels); $tc++) {
         $tempChannel = $this->tempChannels[$tc];
         if ($tempChannel->getTrack() > 0) {
             $channelExists = false;
             for ($c = 0; $c < count($this->channels); $c++) {
                 $channel = $this->channels[$c];
                 $channelRoute = $this->channelRouter->getRoute($channel->getChannelId());
                 if ($channelRoute !== null) {
                     if ($channelRoute->getChannel1() == $tempChannel->getChannel() || $channelRoute->getChannel2() == $tempChannel->getChannel()) {
                         $channelExists = true;
                     }
                 }
             }
             if (!$channelExists) {
                 $channel = new Channel();
                 $channel->setChannelId(count($this->channels) + 1);
                 $channel->setProgram($tempChannel->getInstrument());
                 $channel->setVolume($tempChannel->getVolume());
                 $channel->setBalance($tempChannel->getBalance());
                 $channel->setName('#' . $channel->getChannelId());
                 $channel->setBank($tempChannel->getChannel() == 9 ? Channel::DEFAULT_PERCUSSION_BANK : Channel::DEFAULT_BANK);
                 $channelRoute = new ChannelRoute($channel->getChannelId());
                 $channelRoute->setChannel1($tempChannel->getChannel());
                 $channelRoute->setChannel2($tempChannel->getChannel());
                 for ($tcAux = $tc + 1; $tcAux < count($this->tempChannels); $tcAux++) {
                     $tempChannelAux = $this->tempChannels[$tcAux];
                     if ($tempChannel->getTrack() == $tempChannelAux->getTrack()) {
                         if ($channelRoute->getChannel2() == $channelRoute->getChannel1()) {
                             $channelRoute->setChannel2($tempChannelAux->getChannel());
                         } else {
                             $tempChannelAux->setTrack(-1);
                         }
                     }
                 }
                 $this->channelRouter->configureRoutes($channelRoute, $tempChannel->getChannel() == 9);
                 $this->channels[] = $channel;
             }
         }
     }
 }