コード例 #1
0
    public void SaveToFile(string fileName, IEnumerable <Pitch> allNotes)
    {
        const int MidiFileType        = 0;
        const int BeatsPerMinute      = 60;
        const int TicksPerQuarterNote = 120;

        const int TrackNumber   = 0;
        const int ChannelNumber = 1;

        long absoluteTime = 0;

        var collection = new MidiEventCollection(MidiFileType, TicksPerQuarterNote);

        collection.AddEvent(new TextEvent("Note Stream", MetaEventType.TextEvent, absoluteTime), TrackNumber);
        ++absoluteTime;
        collection.AddEvent(new TempoEvent(CalculateMicrosecondsPerQuaterNote(BeatsPerMinute), absoluteTime), TrackNumber);

        var patchParser = new PatchParser();
        int patchNumber = patchParser.Patch("steel");

        collection.AddEvent(new PatchChangeEvent(0, ChannelNumber, patchNumber), TrackNumber);

        const int  NoteVelocity      = 100;
        const int  NoteDuration      = 3 * TicksPerQuarterNote / 4;
        const long SpaceBetweenNotes = TicksPerQuarterNote;

        foreach (var note in allNotes)
        {
            collection.AddEvent(new NoteOnEvent(absoluteTime, ChannelNumber, note.MidiValue, NoteVelocity, NoteDuration), TrackNumber);
            collection.AddEvent(new NoteEvent(absoluteTime + NoteDuration, ChannelNumber, MidiCommandCode.NoteOff, note.MidiValue, 0), TrackNumber);

            absoluteTime += SpaceBetweenNotes;
        }

        collection.PrepareForExport();
        MidiFile.Export(fileName, collection);
    }
コード例 #2
0
ファイル: Patch.cs プロジェクト: RainmakerUA/mysrc
 public static Patch Parse(IReadOnlyList <string> patchLines)
 {
     return(PatchParser.Parse(patchLines));
 }
        /// <summary>
        /// Method renders file text in new window
        /// </summary>
        /// <param name="data"></param>
        private void renderData(List <string> firstData, List <string> secondData, List <string> patch, string firstTitle, string secondTitle)
        {
            // Create patch parser
            PatchParser patchParser = new PatchParser();

            // First file FlowDocument objects
            FlowDocument firstFlowDocNumbers = new FlowDocument();
            FlowDocument firstFlowDocLines   = new FlowDocument();

            // Second file FlowDocument objects
            FlowDocument secondFlowDocNumbers = new FlowDocument();
            FlowDocument secondFlowDocLines   = new FlowDocument();

            // List with PatchData objects
            var parsedData = patchParser.ParsePatchToDiffs(patch);

            int firstIndex  = 0;
            int secondIndex = 0;

            try
            {
                // Iterate every diff object and update first file
                foreach (Difference data in parsedData)
                {
                    // diffrence between deleted and inserted lines
                    // result give us 3 possible operations
                    int res = data.deletedAmount - data.insertedAmount;

                    // difference between deletedIndex and inserted index with take into account line level difference
                    //int indexRes = data.DeletedIndex - data.InsertedIndex + linesLevel;

                    // 1. if deleted and inserted are equal
                    if (res.Equals(0))
                    {
                        // complete start lines
                        for (int i = firstIndex; i < data.deletedIndex; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(firstData[i]));
                            paragNumbers.Inlines.Add(new Run((i + 1).ToString()));

                            firstFlowDocLines.Blocks.Add(paragLines);
                            firstFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++firstIndex;
                        }

                        // complete start lines
                        for (int i = secondIndex; i < data.insertedIndex; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(secondData[i]));
                            paragNumbers.Inlines.Add(new Run((i + 1).ToString()));

                            secondFlowDocLines.Blocks.Add(paragLines);
                            secondFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++secondIndex;
                        }

                        // Insert changed lines with modyfied style
                        for (int i = data.deletedIndex; i < data.deletedIndex + data.deletedAmount; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFF74F"));
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(firstData[i]));
                            paragNumbers.Inlines.Add(new Run((firstIndex + 1).ToString()));

                            firstFlowDocLines.Blocks.Add(paragLines);
                            firstFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++firstIndex;
                        }

                        // Insert changed lines with modyfied style
                        for (int i = data.insertedIndex; i < data.insertedIndex + data.insertedAmount; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFF74F"));
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(secondData[i]));
                            paragNumbers.Inlines.Add(new Run((secondIndex + 1).ToString()));

                            secondFlowDocLines.Blocks.Add(paragLines);
                            secondFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++secondIndex;
                        }
                    }

                    // 2. if deleted < inserted
                    if (res < 0)
                    {
                        if (lastAction.Equals("d"))
                        {
                            linesLevel *= -1;
                        }
                        // complete start lines to first file
                        for (int i = firstIndex; i < data.insertedIndex + linesLevel; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(firstData[i]));
                            paragNumbers.Inlines.Add(new Run((i + 1).ToString()));

                            firstFlowDocLines.Blocks.Add(paragLines);
                            firstFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++firstIndex;
                        }

                        // complete start lines to second file
                        for (int i = secondIndex; i < data.insertedIndex; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(secondData[i]));
                            paragNumbers.Inlines.Add(new Run((i + 1).ToString()));

                            secondFlowDocLines.Blocks.Add(paragLines);
                            secondFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++secondIndex;
                        }

                        // if there is some changed lines
                        if (data.deletedAmount > 0)
                        {
                            // we add changed lines to first file
                            for (int i = 0; i < data.deletedAmount; ++i)
                            {
                                Paragraph paragLines   = new Paragraph();
                                Paragraph paragNumbers = new Paragraph();

                                // set properties
                                paragLines.Margin          = new Thickness(0, 1, 0, 1);
                                paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFF74F"));
                                paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                                paragNumbers.Foreground    = Brushes.Gray;
                                paragNumbers.TextAlignment = TextAlignment.Right;

                                paragLines.Inlines.Add(new Run(firstData[firstIndex]));
                                paragNumbers.Inlines.Add(new Run((firstIndex + 1).ToString()));

                                firstFlowDocLines.Blocks.Add(paragLines);
                                firstFlowDocNumbers.Blocks.Add(paragNumbers);

                                ++firstIndex;
                            }

                            // we add changed lines to second file
                            for (int i = 0; i < data.deletedAmount; ++i)
                            {
                                Paragraph paragLines   = new Paragraph();
                                Paragraph paragNumbers = new Paragraph();

                                // set properties
                                paragLines.Margin          = new Thickness(0, 1, 0, 1);
                                paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFF74F"));
                                paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                                paragNumbers.Foreground    = Brushes.Gray;
                                paragNumbers.TextAlignment = TextAlignment.Right;

                                paragLines.Inlines.Add(new Run(secondData[secondIndex]));
                                paragNumbers.Inlines.Add(new Run((secondIndex + 1).ToString()));

                                secondFlowDocLines.Blocks.Add(paragLines);
                                secondFlowDocNumbers.Blocks.Add(paragNumbers);

                                ++secondIndex;
                            }
                        }

                        // here add empty lines to first
                        // if d = 0 we dont have information about d index in patch note
                        // so we keep information about added lines in this class
                        for (int i = 0; i < data.insertedAmount - data.deletedAmount; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#CCCCCC"));
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(string.Empty));
                            paragNumbers.Inlines.Add(new Run(string.Empty));

                            firstFlowDocLines.Blocks.Add(paragLines);
                            firstFlowDocNumbers.Blocks.Add(paragNumbers);
                        }

                        // here add inserted lines to second file
                        int tmp = secondIndex;

                        for (int i = secondIndex; i < tmp + data.insertedAmount - data.deletedAmount; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#82FF82"));
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(secondData[i]));
                            paragNumbers.Inlines.Add(new Run((i + 1).ToString()));

                            secondFlowDocLines.Blocks.Add(paragLines);
                            secondFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++secondIndex;
                        }

                        /// set actual line lvl
                        linesLevel += res;
                        lastAction  = "i";
                    }

                    // 3. if deleted > inserted
                    if (res > 0)
                    {
                        if (lastAction.Equals("i"))
                        {
                            linesLevel *= -1;
                        }
                        // complete start lines to first file
                        for (int i = firstIndex; i < data.deletedIndex; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(firstData[i]));
                            paragNumbers.Inlines.Add(new Run((i + 1).ToString()));

                            firstFlowDocLines.Blocks.Add(paragLines);
                            firstFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++firstIndex;
                        }

                        // complete start lines to second file
                        for (int i = secondIndex; i < data.deletedIndex + linesLevel; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(secondData[i]));
                            paragNumbers.Inlines.Add(new Run((i + 1).ToString()));

                            secondFlowDocLines.Blocks.Add(paragLines);
                            secondFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++secondIndex;
                        }

                        // if there is some changed lines
                        if (data.insertedAmount > 0)
                        {
                            // we add changed lines to first file
                            for (int i = 0; i < data.insertedAmount; ++i)
                            {
                                Paragraph paragLines   = new Paragraph();
                                Paragraph paragNumbers = new Paragraph();

                                // set properties
                                paragLines.Margin          = new Thickness(0, 1, 0, 1);
                                paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFF74F"));
                                paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                                paragNumbers.Foreground    = Brushes.Gray;
                                paragNumbers.TextAlignment = TextAlignment.Right;

                                paragLines.Inlines.Add(new Run(firstData[firstIndex]));
                                paragNumbers.Inlines.Add(new Run((firstIndex + 1).ToString()));

                                firstFlowDocLines.Blocks.Add(paragLines);
                                firstFlowDocNumbers.Blocks.Add(paragNumbers);

                                ++firstIndex;
                            }

                            // we add changed lines to second file
                            for (int i = 0; i < data.insertedAmount; ++i)
                            {
                                Paragraph paragLines   = new Paragraph();
                                Paragraph paragNumbers = new Paragraph();

                                // set properties
                                paragLines.Margin          = new Thickness(0, 1, 0, 1);
                                paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFF74F"));
                                paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                                paragNumbers.Foreground    = Brushes.Gray;
                                paragNumbers.TextAlignment = TextAlignment.Right;

                                paragLines.Inlines.Add(new Run(secondData[secondIndex]));
                                paragNumbers.Inlines.Add(new Run((secondIndex + 1).ToString()));

                                secondFlowDocLines.Blocks.Add(paragLines);
                                secondFlowDocNumbers.Blocks.Add(paragNumbers);

                                ++secondIndex;
                            }
                        }

                        int tmp = firstIndex;

                        // add deleted lines to first file
                        for (int i = firstIndex; i < tmp + data.deletedAmount - data.insertedAmount; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#ED121D"));
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(firstData[i]));
                            paragNumbers.Inlines.Add(new Run((i + 1).ToString()));

                            firstFlowDocLines.Blocks.Add(paragLines);
                            firstFlowDocNumbers.Blocks.Add(paragNumbers);

                            ++firstIndex;
                        }

                        tmp = secondIndex;

                        // add empty lines to second file
                        for (int i = 0; i < data.deletedAmount - data.insertedAmount; ++i)
                        {
                            Paragraph paragLines   = new Paragraph();
                            Paragraph paragNumbers = new Paragraph();

                            // set properties
                            paragLines.Margin          = new Thickness(0, 1, 0, 1);
                            paragLines.Background      = (SolidColorBrush)(new BrushConverter().ConvertFrom("#CCCCCC"));
                            paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                            paragNumbers.Foreground    = Brushes.Gray;
                            paragNumbers.TextAlignment = TextAlignment.Right;

                            paragLines.Inlines.Add(new Run(string.Empty));
                            paragNumbers.Inlines.Add(new Run(string.Empty));

                            secondFlowDocLines.Blocks.Add(paragLines);
                            secondFlowDocNumbers.Blocks.Add(paragNumbers);
                        }

                        linesLevel -= res;
                        lastAction  = "d";
                    }
                }

                /// complete last missing linesc to first file
                for (int i = firstIndex; i < firstData.Count; ++i)
                {
                    Paragraph paragLines   = new Paragraph();
                    Paragraph paragNumbers = new Paragraph();

                    // set properties
                    paragLines.Margin          = new Thickness(0, 1, 0, 1);
                    paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                    paragNumbers.Foreground    = Brushes.Gray;
                    paragNumbers.TextAlignment = TextAlignment.Right;

                    paragLines.Inlines.Add(new Run(firstData[i]));
                    paragNumbers.Inlines.Add(new Run((firstIndex + 1).ToString()));

                    firstFlowDocLines.Blocks.Add(paragLines);
                    firstFlowDocNumbers.Blocks.Add(paragNumbers);

                    ++firstIndex;
                }

                /// complete last missing linesc to second file
                for (int i = secondIndex; i < secondData.Count; ++i)
                {
                    Paragraph paragLines   = new Paragraph();
                    Paragraph paragNumbers = new Paragraph();

                    // set properties
                    paragLines.Margin          = new Thickness(0, 1, 0, 1);
                    paragNumbers.Margin        = new Thickness(5, 1, 5, 1);
                    paragNumbers.Foreground    = Brushes.Gray;
                    paragNumbers.TextAlignment = TextAlignment.Right;

                    paragLines.Inlines.Add(new Run(secondData[i]));
                    paragNumbers.Inlines.Add(new Run((secondIndex + 1).ToString()));

                    secondFlowDocLines.Blocks.Add(paragLines);
                    secondFlowDocNumbers.Blocks.Add(paragNumbers);

                    ++secondIndex;
                }

                /// Set window title
                TitleFirst.Content  = firstTitle;
                TitleSecond.Content = secondTitle;

                /// Set components
                //richTextBoxNumbers1.Document = flowDocNumbers;
                richTextBoxLines1.Document   = firstFlowDocLines;
                richTextBoxNumbers1.Document = firstFlowDocNumbers;

                richTextBoxLines2.Document   = secondFlowDocLines;
                richTextBoxNumbers2.Document = secondFlowDocNumbers;
            }
            catch (IndexOutOfRangeException ex)
            {
                MessageBox.Show("Źródła projektu są aktualne", "Błąd podczas nakładania łatki", MessageBoxButton.OK);
            }
        }