protected Measure ReadMeasure(Measure previous)
        {
            Measure measure = Measure.GetMeasureFromPrevious(previous);
            measure.Header = (byte)stream.ReadByte();

            //TODO: move this code into header's setter
            // Numerator
            if ((measure.Header & 0x01) != 0)
                measure.NumeratorSignature = ReadByte();

            // Denominator
            if ((measure.Header & 0x02) != 0)
                measure.DenominatorSignature = ReadByte();

            // Beginning of repeat
            measure.BeginRepeat = ((measure.Header & 0x04) != 0);

            // End of repeat
            if ((measure.Header & 0x08) != 0)
                measure.EndRepeat = ReadByte();

            // Number of alternate endings
            if ((measure.Header & 0x10) != 0)
                measure.NumberAltEnding = ReadByte();

            // Marker
            if ((measure.Header & 0x20) != 0)
                measure.PresenceMarker = ReadMarker();

            // Tonality
            if ((measure.Header & 0x40) != 0)
            {
                ReadByte();
                ReadByte();
            }
            //measure.TonalityMeasure = ReadKey();

            // Presence of a double bar
            measure.PresenceDoubleBar = ((measure.Header & 0x80) != 0);

            return measure;
        }
        protected Measure ReadMeasure(Measure previous)
        {
            Measure measure = Measure.GetMeasureFromPrevious(previous);
            measure.Header = (byte)stream.ReadByte();

            //TODO: move this code into header's setter
            // Numerator
            if ((measure.Header & 0x01) != 0)
                measure.NumeratorSignature = ReadByte();

            // Denominator
            if ((measure.Header & 0x02) != 0)
                measure.DenominatorSignature = ReadByte();

            // Beginning of repeat
            measure.BeginRepeat = ((measure.Header & 0x04) != 0);

            // End of repeat
            if ((measure.Header & 0x08) != 0)
                measure.EndRepeat = (byte)((ReadByte() & 0xff) - 1);

            // Marker
            if ((measure.Header & 0x20) != 0)
                measure.PresenceMarker = ReadMarker();

            // Number of alternate endings
            if ((measure.Header & 0x10) != 0)
                measure.NumberAltEnding = ReadByte();

            // Tonality
            if ((measure.Header & 0x40) != 0)
            {
                //measure.TonalityMeasure = ReadKey();
                ReadByte();
                ReadByte();
            }

            if ((measure.Header & 0x01) != 0)
                Skip(4);

            if ((measure.Header & 0x10) == 0)
                Skip(1);

            int tripletFeel = ReadByte();

            //TODO Implement tripletFeel
            /*if (tripletFeel == 1)
            {
                header.setTripletFeel(TGMeasureHeader.TRIPLET_FEEL_EIGHTH);
            }
            else if (tripletFeel == 2)
            {
                header.setTripletFeel(TGMeasureHeader.TRIPLET_FEEL_SIXTEENTH);
            }
            else
            {
                header.setTripletFeel(TGMeasureHeader.TRIPLET_FEEL_NONE);
            }*/

            // Presence of a double bar
            //measure.PresenceDoubleBar = ((measure.Header & 0x80) != 0);

            return measure;
        }
        public static TabFile CreateFromGp(Stream stream)
        {
            TabFile file = new TabFile();

            var gpFile = GpFactory.CreateFile(stream);
            int tracksCount = gpFile.Body.Tracks.Length;
            int measureTrackPairsCount = gpFile.Body.MeasureTrackPairs.Length;
            int measureCount = gpFile.Body.Measures.Length;
            //tracks init
            for (int i = 0; i < tracksCount; i++)
            {
                //TODO: init track header
                Track track = new Track
                {
                    Index = i,
                    Name = gpFile.Body.Tracks[i].Name,
                    IsDrum = gpFile.Body.Tracks[i].IsDrumsTrack,
                    StringNumber = gpFile.Body.Tracks[i].StringNumber
                };
                for (int j = 0; j < measureCount; j++)
                {
                    // if ((j + i) % tracksCount != 0)
                    //     continue;//other track measure
                    //TODO init measure
                    Measure measure = new Measure();
                    measure.NumeratorSignature = gpFile.Body.Measures[j].NumeratorSignature;
                    measure.DenominatorSignature = gpFile.Body.Measures[j].DenominatorSignature;
                    measure.StringsNumber = gpFile.Body.Tracks[i].StringNumber; //TODO: ambiguous usage
                    foreach (var gpBeat in gpFile.Body.MeasureTrackPairs[j * tracksCount + i].Beats)
                    {
                        //TODO init beat
                        Beat beat = new Beat();
                        beat.Duration = (Tablature.Duration)gpBeat.Duration;
                        beat.Tuplet = gpBeat.NTuplet;
                        beat.IsDotted = gpBeat.DottedNotes;
                        //TODO this is for 6-strings only
                        var stringCount = gpBeat.Strings.Length;
                        beat.Notes = new List<Note>();
                        for (int s = 0; s < stringCount; s++)
                            beat.Notes.Add(new Note() { Fret = "" });

                        int noteIndex = 0;
                        for (int stringIndex = 0; stringIndex < stringCount; stringIndex++)
                        {
                            var gpIdx = stringCount-1-stringIndex;
                            if (!gpBeat.Strings[gpIdx])
                                continue;

                            var effects = gpBeat.Notes[noteIndex].Effects ?? new EffectsOnNote();
                            beat.Notes[stringIndex] = new Note()
                            {
                                Fret = gpBeat.Notes[noteIndex].FretNumber.ToString(),
                                IsLegato = effects.HammerOnPullOff,
                                Bend = effects.Bend == null ? null : new Bend(),
                                Slide = effects.Slide ==
                                PhoneGuitarTab.Tablature.GuitarPro.Slide.NoSlide ? null : new Slide()
                            };
                            noteIndex++;
                        }

                        measure.Beats.Add(beat);
                    }
                    track.Measures.Add(measure);
                }
                file.Tracks.Add(track);
            }
            return file;
        }
예제 #4
0
        public static TabFile CreateFromGp(Stream stream)
        {
            TabFile file = new TabFile();

            var gpFile                 = GpFactory.CreateFile(stream);
            int tracksCount            = gpFile.Body.Tracks.Length;
            int measureTrackPairsCount = gpFile.Body.MeasureTrackPairs.Length;
            int measureCount           = gpFile.Body.Measures.Length;

            //tracks init
            for (int i = 0; i < tracksCount; i++)
            {
                //TODO: init track header
                Track track = new Track
                {
                    Index        = i,
                    Name         = gpFile.Body.Tracks[i].Name,
                    IsDrum       = gpFile.Body.Tracks[i].IsDrumsTrack,
                    StringNumber = gpFile.Body.Tracks[i].StringNumber
                };
                for (int j = 0; j < measureCount; j++)
                {
                    // if ((j + i) % tracksCount != 0)
                    //     continue;//other track measure
                    //TODO init measure
                    Measure measure = new Measure();
                    measure.NumeratorSignature   = gpFile.Body.Measures[j].NumeratorSignature;
                    measure.DenominatorSignature = gpFile.Body.Measures[j].DenominatorSignature;
                    measure.StringsNumber        = gpFile.Body.Tracks[i].StringNumber; //TODO: ambiguous usage
                    foreach (var gpBeat in gpFile.Body.MeasureTrackPairs[j * tracksCount + i].Beats)
                    {
                        //TODO init beat
                        Beat beat = new Beat();
                        beat.Duration = (Tablature.Duration)gpBeat.Duration;
                        beat.Tuplet   = gpBeat.NTuplet;
                        beat.IsDotted = gpBeat.DottedNotes;
                        //TODO this is for 6-strings only
                        var stringCount = gpBeat.Strings.Length;
                        beat.Notes = new List <Note>();
                        for (int s = 0; s < stringCount; s++)
                        {
                            beat.Notes.Add(new Note()
                            {
                                Fret = ""
                            });
                        }

                        int noteIndex = 0;
                        for (int stringIndex = 0; stringIndex < stringCount; stringIndex++)
                        {
                            var gpIdx = stringCount - 1 - stringIndex;
                            if (!gpBeat.Strings[gpIdx])
                            {
                                continue;
                            }

                            var effects = gpBeat.Notes[noteIndex].Effects ?? new EffectsOnNote();
                            beat.Notes[stringIndex] = new Note()
                            {
                                Fret     = gpBeat.Notes[noteIndex].FretNumber.ToString(),
                                IsLegato = effects.HammerOnPullOff,
                                Bend     = effects.Bend == null ? null : new Bend(),
                                Slide    = effects.Slide ==
                                           PhoneGuitarTab.Tablature.GuitarPro.Slide.NoSlide ? null : new Slide()
                            };
                            noteIndex++;
                        }

                        measure.Beats.Add(beat);
                    }
                    track.Measures.Add(measure);
                }
                file.Tracks.Add(track);
            }
            return(file);
        }