Friday, June 13, 2025

RAGA DECORS CODES

        private void button___TO_DECORATE_THE_SEQUENCES_WITH_DIFFERENT_STYLES_Click(object sender, EventArgs e)

        {

            //we assume the notepad++ so we dont save when reload current

            //we assume the notepad++ so we dont save when reload current

            //we assume the notepad++ so we dont save when reload current

            //////TRYS_NOTES_NOS   ######      MILLISECOND   ######      CURR_NOTES_VELOCITY   ######      CURR_NOTES_PATCH   ######      PERCENTAGES_DURATIONS_COMMASEPS_PTCHBNDS   ######      WITHIN_NOTES_PTCHBENDS_VALUES   ######      CHANNEL   ######      TRACK   ######      NOTES_NUMBERS   ######      NOTES_FREQUENCYS   ######      

            //////61   ######      1000   ######      127   ######      73   ######      0,100   ######      8192,16368   ######      3   ######      3   ######      D4   ######      293.66   ######         ROW_NUMBER=0

            //////62   ######      1000   ######      127   ######      71   ######      0,100   ######      8192,16368   ######      3   ######      3   ######      D#4/Eb4   ######      311.13   ######         ROW_NUMBER=1

            //////63   ######      1000   ######      127   ######      73   ######      0,100   ######      8192,16368   ######      3   ######      3   ######      E4   ######      329.63   ######         ROW_NUMBER=2

            //////57   ######      1000   ######      127   ######      73   ######      0,100   ######      8192,16368   ######      3   ######      3   ######      A#3/Bb3   ######      233.08   ######         ROW_NUMBER=3

            //////53   ######      1000   ######      127   ######      66   ######      0,100   ######      8192,16368   ######      3   ######      3   ######      F#3/Gb3   ######      185   ######         ROW_NUMBER=4

            //////52   ######      1000   ######      127   ######      68   ######      0,100   ######      8192,16368   ######      3   ######      3   ######      F3   ######      174.61   ######         ROW_NUMBER=5

            //////LYRSYLLS   ######      INDINOTES   ######      TRYS_NOTES_NOS   ######      MILLISECOND   ######      CURR_NOTES_VELOCITY   ######      CURR_NOTES_PATCH   ######      PERCENTAGES_DURATIONS_COMMASEPS_PTCHBNDS   ######      WITHIN_NOTES_PTCHBENDS_VALUES   ######      CHANNEL   ######      TRACK   ######      NOTES_NUMBERS   ######      NOTES_FREQUENCYS   ######      JERK_MILLIS_GAP   ######      JERK_UP_PITCHBEND   ######      JERK_DOWN_PITCH_BEND   ######      

            //////-   ######      n   ######      64   ######      324   ######      127   ######      73   ######      0,3,20,22,30,38,48,60,68,98,100   ######      8192,2000,11000,6000,8000,600,9000,8000,3000,11000,8000   ######      3   ######      3   ######      F4   ######      349.23   ######      0   ######      0   ######      0   ######         ROW_NUMBER=0

            //////-   ######      s   ######      64   ######      324   ######      127   ######      73   ######      0,3,20,22,30,38,48,60,68,98,100   ######      8192,2000,11000,6000,8000,600,9000,8000,3000,11000,8000   ######      3   ######      3   ######      F4   ######      349.23   ######      0   ######      0   ######      0   ######         ROW_NUMBER=1

            //////-   ######      s   ######      53   ######      324   ######      127   ######      73   ######      0,3,20,22,30,38,48,60,68,98,100   ######      8192,2000,11000,6000,8000,600,9000,8000,3000,11000,8000   ######      3   ######      3   ######      F#3/Gb3   ######      185   ######      0   ######      0   ######      0   ######         ROW_NUMBER=2

            //////-   ######      g   ######      57   ######      324   ######      127   ######      73   ######      0,3,20,22,30,38,48,60,68,98,100   ######      8192,2000,11000,6000,8000,600,9000,8000,3000,11000,8000   ######      3   ######      3   ######      A#3/Bb3   ######      233.08   ######      0   ######      0   ######      0   ######         ROW_NUMBER=3

            //////-   ######      d   ######      64   ######      324   ######      127   ######      73   ######      0,3,20,22,30,38,48,60,68,98,100   ######      8192,2000,11000,6000,8000,600,9000,8000,3000,11000,8000   ######      3   ######      3   ######      F4   ######      349.23   ######      0   ######      0   ######      0   ######         ROW_NUMBER=4

            //////-   ######      r   ######      55   ######      324   ######      127   ######      73   ######      0,3,20,22,30,38,48,60,68,98,100   ######      8192,2000,11000,6000,8000,600,9000,8000,3000,11000,8000   ######      3   ######      3   ######      G#3/Ab3   ######      349.23   ######      0   ######      0   ######      0   ######         ROW_NUMBER=5

            //////-   ######      r   ######      55   ######      324   ######      127   ######      73   ######      0,3,20,22,30,38,48,60,68,98,100   ######      8192,2000,11000,6000,8000,600,9000,8000,3000,11000,8000   ######      3   ######      3   ######      G#3/Ab3   ######      349.23   ######      0   ######      0   ######      0   ######         ROW_NUMBER=6

            ///FOR REFERENCES  openFileDialogForDXFFiles.Filter = "dstv/nc1 Files (.nc1)|*.nc1|AdvanceSteels dstv/nc1 Files (.nc)|*.nc|All Files (*.*)|*.*";

            // Open file dialog to select PDF file

            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.Filter = "COMPOSERF Files|*.dataGridView___COMPOSER|SAANCOMPOSER FILES|*.SAANCOMPOSER|All Files (*.*)|*.*";

            string ___dummyfilesnamesformids_currentdatagridsstates_timestamps =

            ExcelFormulaParser_GT_PARSERSample.Program.public_static_string_GT_folder;

            //+ System.DateTime.Now.ToString("ddmmyyyyhhmmss").TrimEnd().TrimStart().Trim() + ".dataGridView___COMPOSER";

            openFileDialog.FileName = ___dummyfilesnamesformids_currentdatagridsstates_timestamps;

            this.___selected_filesnames_for_inputdataGridView___COMPOSER_files = "";

            if (openFileDialog.ShowDialog() == DialogResult.OK)

            {

                string inputdataGridView___COMPOSER = openFileDialog.FileName;

                //  string outputPdfPath = inputPdfPath + "_output_with_circle.pdf"; // Output file path

                this.___selected_filesnames_for_inputdataGridView___COMPOSER_files = inputdataGridView___COMPOSER;

                Console.WriteLine("inputdataGridView___COMPOSER = " + inputdataGridView___COMPOSER);

                to___load_current_composer_textfiles_data_to_preclean_then_datagrids_state_to_files(inputdataGridView___COMPOSER);

                System.Windows.Forms.MessageBox.Show("We will call GenerateOddEvenRagaFile" + inputdataGridView___COMPOSER);

                SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                    .RagaPaltas_OddEvenConcatenator

                    .GenerateOddEvenRagaFile

                    (

                    inputdataGridView___COMPOSER

                  //  ,

                  //  inputdataGridView___COMPOSER.Replace(".dataGridView___COMPOSER", "_extended_durations_loops_003") + ".dataGridView___COMPOSER"

                    );

                System.Windows.Forms.MessageBox.Show("We will call RagaPaltas_DiagonalConcatenator" + inputdataGridView___COMPOSER);

                SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                    .RagaPaltas_DiagonalConcatenator

                    .GenerateDiagonalDecoratedFile

                    (

                    inputdataGridView___COMPOSER

                    //  ,

                    //  inputdataGridView___COMPOSER.Replace(".dataGridView___COMPOSER", "_extended_durations_loops_003") + ".dataGridView___COMPOSER"

                    );

                System.Windows.Forms.MessageBox.Show("We will call RagaPaltas_ZigZagDiagonalConcatenator" + inputdataGridView___COMPOSER);

                SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                    .RagaPaltas_ZigZagDiagonalConcatenator

                    .GenerateZigzagDiagonalDecoratedFile

                    (

                    inputdataGridView___COMPOSER

                    //  ,

                    //  inputdataGridView___COMPOSER.Replace(".dataGridView___COMPOSER", "_extended_durations_loops_003") + ".dataGridView___COMPOSER"

                    );

                System.Windows.Forms.MessageBox.Show("We will call RagaPaltas_SpiralDiagonal_merges_0_to_360_Composer" + inputdataGridView___COMPOSER);

                SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                    .RagaPaltas_SpiralDiagonal_merges_0_to_360_Composer

                    .GenerateSpiralDiagonalDecoratedFile

                    (

                    inputdataGridView___COMPOSER

                    //  ,

                    //  inputdataGridView___COMPOSER.Replace(".dataGridView___COMPOSER", "_extended_durations_loops_003") + ".dataGridView___COMPOSER"

                    );

                System.Windows.Forms.MessageBox.Show("We will call NecklacePatternComposer" + inputdataGridView___COMPOSER);

                SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                    .NecklacePatternComposer

                    .ComposeFromNecklacePattern

                    (

                    inputdataGridView___COMPOSER

                    //  ,

                    //  inputdataGridView___COMPOSER.Replace(".dataGridView___COMPOSER", "_extended_durations_loops_003") + ".dataGridView___COMPOSER"

                    );

                //System.Windows.Forms.MessageBox.Show("We will call RagaPaltasGenerator___reading_the___dataGridView___COMPOSER___generates_another___dataGridView___COMPOSER   on  inputdataGridView___COMPOSER " + inputdataGridView___COMPOSER);

                //////SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                //////    .RagaPaltasGenerator___reading_the___dataGridView___COMPOSER___generates_another___dataGridView___COMPOSER

                //////    .GenerateExtendedRagaFile

                //////    (

                //////    inputdataGridView___COMPOSER

                //////    ,

                //////    inputdataGridView___COMPOSER.Replace(".dataGridView___COMPOSER","_extended_durations_loops_003")+".dataGridView___COMPOSER"

                //////    );

                ///

                /// 

                /// 

                /// //stopping this it copies all durations to all notes and generates nxn data structures

                //////SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                ////// .RagaPaltasGenerator___reading_the___dataGridView___COMPOSER___generates_another___dataGridView___COMPOSER

                ////// .GenerateExtendedRagaFile___ALL_THE_NOTES_WITH_SAMES_DURATIONS_OF_OTHER_NOTES

                ////// //.GenerateExtendedRagaFile

                ////// (

                ////// inputdataGridView___COMPOSER

                ////// ,

                ////// inputdataGridView___COMPOSER + "_SAMES_durations_REPEATS_loops_003" + ".dataGridView___COMPOSER"

                ////// );

                // to___load_current_composer_textfiles_data_to_preclean_then_datagrids_state_to_files

                // hangs

                //////  //I:\R___DES\RAGA_GUIDES_TOO_IMPORTANT\alaiyasshrutikakks\only7.txt

                //////  System.Windows.Forms.MessageBox.Show("We will call RagaPaltasGroupwisePermuter_WithMeasureBoundaries   on  inputdataGridView___COMPOSER " + inputdataGridView___COMPOSER);

                //////  //i will generate only first 5990 rows

                //////  SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                //////  .RagaPaltasGroupwisePermuter_WithMeasureBoundaries

                //////  .GenerateRagaFiles_WithMeasurewiseDurationPermutations

                //////  //.GenerateExtendedRagaFile

                //////  (

                //////  inputdataGridView___COMPOSER

                ////// // ,

                ////////  inputdataGridView___COMPOSER + "_WITH_PERMUTED(UPTO_8_NOTES)__durations_loops_003" + ".dataGridView___COMPOSER"

                //////  );

                // hangs

                //////System.Windows.Forms.MessageBox.Show("We will call RagaPaltasGenerator___reading_the___dataGridView___COMPOSER___generates_another___dataGridView___COMPOSER   on  inputdataGridView___COMPOSER " + inputdataGridView___COMPOSER);

                ////////i will generate only first 5990 rows

                //////SAANS_ROUGH_BEATS_COMPOSER_FOR_ON_SELECTIONS_LOOP_CYCLES

                //////.RagaPaltasGenerator___PERMUTED_DURATIONS_SEQUENCES_COPIERS_reading_the___dataGridView___COMPOSER___generates_another___dataGridView___COMPOSER

                //////.GenerateExtendedRagaFile___ALL_THE_NOTES_WITH_PERMUTED_DURATIONS_OF_OTHER_NOTES

                ////////.GenerateExtendedRagaFile

                //////(

                //////inputdataGridView___COMPOSER

                //////,

                //////inputdataGridView___COMPOSER + "_WITH_PERMUTED(UPTO_8_NOTES)__durations_loops_003" + ".dataGridView___COMPOSER"

                //////);

            }// if (openFileDialog.ShowDialog() == DialogResult.OK)

            this.dataGridView___COMPOSER.ClearSelection();

        }// private void button___TO_DECORATE_THE_SEQUENCES_WITH_DIFFERENT_STYLES_Click(object sender, EventArgs e)

    public class NecklacePatternComposer

    {

        public static void ComposeFromNecklacePattern(string inputFile)

        {

            var fundamentalSequence = RagaPaltas_OddEvenConcatenator.LoadCleanNotesFromFile(inputFile);

            if (fundamentalSequence.Count == 0)

            {

                Console.WriteLine("No valid notes found in input.");

                return;

            }//if (fundamentalSequence.Count == 0)

            var reversedSequence = RagaPaltas_OddEvenConcatenator.CloneList(fundamentalSequence);

            reversedSequence.Reverse();

            var necklace = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            necklace.AddRange(fundamentalSequence);

            necklace.AddRange(reversedSequence);

            int length = necklace.Count;

            string input = Microsoft.VisualBasic.Interaction.InputBox("Enter comma/space/semicolon separated offset indices (e.g. 3,5,7):", "Offset Index Pattern", "3, 5, 7");

            var tokens = input.Split(new[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);

            var offsets = tokens.Select(t => int.TryParse(t.Trim(), out int num) ? num : -1).Where(i => i >= 0).ToList();

            if (offsets.Count == 0)

            {

                Console.WriteLine("No valid offsets provided.");

                return;

            }//if (offsets.Count == 0)

            var result = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            for (int i = 0; i < length; i++)

            {

                foreach (var offset in offsets)

                {

                    int index = (i + offset) % length;

                    result.Add(necklace[index]);

                }//foreach (var offset in offsets)

                for (int j = offsets.Count - 1; j >= 0; j--)

                {

                    int index = (i + offsets[j]) % length;

                    result.Add(necklace[index]);

                }//for (int j = offsets.Count - 1; j >= 0; j--)

            }//for (int i = 0; i < length; i++)

            string outputPath = inputFile + "__NecklaceOffsetDecorated.dataGridView___COMPOSER";

            RagaPaltas_OddEvenConcatenator.SaveNotesToFile(outputPath, result);

            Console.WriteLine("Saved decorated necklace sequence to: " + outputPath);

        }//public static void ComposeFromNecklacePattern(string inputFile)

    }//public class NecklacePatternComposer

    //////using System;

    //////using System.Collections.Generic;

    //////using System.Linq;

    //////using System.Windows.Forms;

    //////using Microsoft.VisualBasic;

    //////public class NecklacePatternComposer

    //////{

    //////    public static void GenerateNecklaceDecoratedSequence(List<string> fundamentalSequence)

    //////    {

    //////        // Step 1: Create necklace (fundamental + reverse)

    //////        var reversed = new List<string>(fundamentalSequence);

    //////        reversed.Reverse();

    //////        var necklace = new List<string>(fundamentalSequence);

    //////        necklace.AddRange(reversed); // Length = 2n

    //////        int n = fundamentalSequence.Count;

    //////        int fullLength = 2 * n;

    //////        // Step 2: Get offset input

    //////        string input = Microsoft.VisualBasic.Interaction.InputBox(

    //////            "Enter offset sequence (comma/semicolon/space separated):",

    //////            "Offset Pattern", "3, 5, 7");

    //////        if (string.IsNullOrWhiteSpace(input)) return;

    //////        var offsetTokens = input.Split(new[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);

    //////        var offsets = offsetTokens.Select(token => int.TryParse(token.Trim(), out var num) ? num : -1)

    //////                                  .Where(num => num >= 0).ToList();

    //////        if (offsets.Count == 0)

    //////        {

    //////            MessageBox.Show("No valid offsets entered.", "Error");

    //////            return;

    //////        }//if (offsets.Count == 0)

    //////        var reversedOffsets = new List<int>(offsets);

    //////        reversedOffsets.Reverse();

    //////        var finalSequence = new List<string>();

    //////        // Step 3: Apply all i + r and i + reversed(r) for i in 0 to 2n - 1

    //////        for (int i = 0; i < fullLength; i++)

    //////        {

    //////            foreach (var offset in offsets)

    //////            {

    //////                int idx = (i + offset) % fullLength;

    //////                finalSequence.Add(necklace[idx]);

    //////            }//foreach (var offset in offsets)

    //////            foreach (var offset in reversedOffsets)

    //////            {

    //////                int idx = (i + offset) % fullLength;

    //////                finalSequence.Add(necklace[idx]);

    //////            }//foreach (var offset in reversedOffsets)

    //////        }//for (int i = 0; i < fullLength; i++)

    //////        // Step 4: Save or preview result

    //////        string preview = string.Join(" ", finalSequence.Take(50)) + (finalSequence.Count > 50 ? " ..." : "");

    //////        MessageBox.Show("Preview of generated sequence:\n" + preview, "Preview");

    //////        // Optional: Save to file or export to data grid

    //////        // SaveSequenceToFile("decorated_sequence.txt", finalSequence);

    //////    }//public class NecklacePatternComposer

    //////    // Example loader

    //////    public static List<string> LoadNotesFromFile(string path)

    //////    {

    //////        var lines = System.IO.File.ReadAllLines(path);

    //////        return lines.Where(line => !string.IsNullOrWhiteSpace(line)).ToList();

    //////    }//public static List<string> LoadNotesFromFile(string path)

    //////    // Optional file saver

    //////    public static void SaveSequenceToFile(string path, List<string> sequence)

    //////    {

    //////        System.IO.File.WriteAllLines(path, sequence);

    //////        MessageBox.Show("Saved to " + path);

    //////    }//public static void SaveSequenceToFile(string path, List<string> sequence)

    //////}//public class NecklacePatternComposer

    public class RagaPaltas_ZigZagDiagonalConcatenator

    {

        const string Separator = "######";

        const int MaxNotesPerFile = 5990;

        public static void GenerateZigzagDiagonalDecoratedFile(string inputFile)

        {

            var rawNotes = RagaPaltas_OddEvenConcatenator.LoadCleanNotesFromFile(inputFile);

            Console.WriteLine("Loaded valid notes: " + rawNotes.Count);

            int n = rawNotes.Count;

            if (n == 0) return;

            // Form n x n matrix

            var grid = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS[n, n];

            for (int col = 0; col < n; col++)

            {

                for (int row = 0; row < n; row++)

                {

                    grid[row, col] = RagaPaltas_OddEvenConcatenator.CloneList(rawNotes)[row];

                }

            }

            var finalList = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            // Traverse diagonals

            for (int d = 0; d <= 2 * (n - 1); d++)

            {

                var diagList = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

                for (int row = 0; row < n; row++)

                {

                    int col = d - row;

                    if (col >= 0 && col < n)

                    {

                        diagList.Add(grid[row, col]);

                    }

                }

                if (d % 2 == 0)

                {

                    finalList.AddRange(diagList); // forward

                }

                else

                {

                    diagList.Reverse(); // reverse

                    finalList.AddRange(diagList);

                }

            }

            string outputPath = inputFile + "__ZigzagDiagonalDecorated.dataGridView___COMPOSER";

            RagaPaltas_OddEvenConcatenator.SaveNotesToFile(outputPath, finalList);

            Console.WriteLine("Saved zigzag diagonal-decorated notes to: " + outputPath);

        }//public static void GenerateZigzagDiagonalDecoratedFile(string inputFile)

        public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadCleanNotesFromFile(string path)

        {

            var notes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            int lineIndex = 0;

            foreach (var line in File.ReadLines(path))

            {

                if (lineIndex++ == 0) continue; // skip header

                var parts = line.Split(new[] { Separator }, StringSplitOptions.None).Select(p => p.Trim()).ToArray();

                if (parts.Length < 22) continue;

                string indinote = parts[1];

                if (string.IsNullOrWhiteSpace(indinote) || indinote == "|" || indinote == "&" || indinote == "@" || indinote == "{" || indinote == "}" || indinote == "[" || indinote == "]" || indinote == "(" || indinote == ")")

                    continue;

                var note = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS();

                try { note.PUBLIC_STRING_THE_LYR_FOUND = parts[0]; } catch { note.PUBLIC_STRING_THE_LYR_FOUND = "LYR"; }

                try { note.PUBLIC_STRING_THE_INDINOTE_FOUND = parts[1]; } catch { note.PUBLIC_STRING_THE_INDINOTE_FOUND = "S"; }

                try { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = int.Parse(parts[2]); } catch { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = 60; }

                try { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = double.Parse(parts[3], CultureInfo.InvariantCulture); } catch { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 500; }

                try { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = int.Parse(parts[4]); } catch { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = 100; }

                try { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = int.Parse(parts[5]); } catch { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = 73; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = parts[6]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = "0,100"; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = parts[7]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = "8192,8192"; }

                try { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = int.Parse(parts[8]); } catch { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = 1; }

                try { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = int.Parse(parts[9]); } catch { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = 1; }

                try { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = double.Parse(parts[13], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = 0; }

                try { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = int.Parse(parts[14]); } catch { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = 0; }

                try { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = int.Parse(parts[15]); } catch { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = 0; }

                try { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = double.Parse(parts[16], CultureInfo.InvariantCulture); } catch { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = 0; }

                try { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = double.Parse(parts[17], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = 0; }

                try { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = double.Parse(parts[18], CultureInfo.InvariantCulture); } catch { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = 0; }

                try { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = double.Parse(parts[19], CultureInfo.InvariantCulture); } catch { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = 0; }

                try { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = int.Parse(parts[20]); } catch { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = 6; }

                try { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = int.Parse(parts[21]); } catch { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = 64; }

                notes.Add(note);

            }

            return notes;

        }

        private static PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS CloneNote(PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS note)

        {

            return new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS

            {

                PUBLIC_STRING_THE_LYR_FOUND = note.PUBLIC_STRING_THE_LYR_FOUND,

                PUBLIC_STRING_THE_INDINOTE_FOUND = note.PUBLIC_STRING_THE_INDINOTE_FOUND,

                INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127,

                DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY,

                INT_CURRENT_NOTES_VELOCITY_0_TO_127 = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127,

                INT_CURRENT_NOTES_PATCH_0_TO_127 = note.INT_CURRENT_NOTES_PATCH_0_TO_127,

                STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS,

                STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES,

                PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15,

                PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER,

                PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP,

                PUBLIC_INT___Column_JUERK_UP_PITCHBEND = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND,

                PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND,

                PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS,

                PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES,

                Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES,

                Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES,

                PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20,

                PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT

            };

        } //private static PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS CloneNote(PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS note)

        //////public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> CloneList(List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> list)

        //////{

        //////    return list.Select(CloneNote).ToList();

        //////}//private static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> CloneList(List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> list)

        //////public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

        //////{

        //////    using (var writer = new StreamWriter(path))

        //////    {

        //////        foreach (var note in notes.Take(MaxNotesPerFile))

        //////        {

        //////            var fields = new string[22];

        //////            fields[0] = note.PUBLIC_STRING_THE_LYR_FOUND;

        //////            fields[1] = note.PUBLIC_STRING_THE_INDINOTE_FOUND;

        //////            fields[2] = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127.ToString();

        //////            fields[3] = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY.ToString(CultureInfo.InvariantCulture);

        //////            fields[4] = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127.ToString();

        //////            fields[5] = note.INT_CURRENT_NOTES_PATCH_0_TO_127.ToString();

        //////            fields[6] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS;

        //////            fields[7] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES;

        //////            fields[8] = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15.ToString();

        //////            fields[9] = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER.ToString();

        //////            fields[10] = "to_fill";

        //////            fields[11] = "51.97";

        //////            fields[12] = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP.ToString(CultureInfo.InvariantCulture);

        //////            fields[13] = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND.ToString();

        //////            fields[14] = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND.ToString();

        //////            fields[15] = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS.ToString(CultureInfo.InvariantCulture);

        //////            fields[16] = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES.ToString(CultureInfo.InvariantCulture);

        //////            fields[17] = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES.ToString(CultureInfo.InvariantCulture);

        //////            fields[18] = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES.ToString(CultureInfo.InvariantCulture);

        //////            fields[19] = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20.ToString();

        //////            fields[20] = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT.ToString();

        //////            writer.WriteLine(string.Join(" " + Separator + " ", fields));

        //////        }//foreach (var note in notes.Take(MaxNotesPerFile))

        //////    }//using (var writer = new StreamWriter(path))

        //////}//public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

    }//public class RagaPaltas_ZigZagDiagonalConcatenator

    public class RagaPaltas_SpiralDiagonal_merges_0_to_360_Composer

    {

        const string Separator = "######";

        public static void GenerateSpiralDiagonalDecoratedFile(string inputFile)

        {

            var fundamentalSequence = RagaPaltas_OddEvenConcatenator.LoadCleanNotesFromFile(inputFile);

            var reversedSequence = RagaPaltas_OddEvenConcatenator.CloneList(fundamentalSequence);

            reversedSequence.Reverse();

            var groupedSequence = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            groupedSequence.AddRange(fundamentalSequence);

            groupedSequence.AddRange(reversedSequence);

            int copies = 1;

            try

            {

                string response = Microsoft.VisualBasic.Interaction.InputBox("Enter number of copies for spiral:", "Spiral Copies", "1");

                copies = int.TryParse(response, out int result) ? Math.Max(1, result) : 1;

            }

            catch { copies = 1; }

            var spiralList = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            for (int i = 0; i < copies; i++)

                spiralList.AddRange(RagaPaltas_OddEvenConcatenator.CloneList(groupedSequence));

            int size = (int)Math.Ceiling(Math.Sqrt(spiralList.Count));

            var spiralGrid = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS[size, size];

            int top = 0, bottom = size - 1, left = 0, right = size - 1, index = 0;

            while (top <= bottom && left <= right && index < spiralList.Count)

            {

                for (int i = left; i <= right && index < spiralList.Count; i++) spiralGrid[top, i] = spiralList[index++];

                top++;

                for (int i = top; i <= bottom && index < spiralList.Count; i++) spiralGrid[i, right] = spiralList[index++];

                right--;

                for (int i = right; i >= left && index < spiralList.Count; i--) spiralGrid[bottom, i] = spiralList[index++];

                bottom--;

                for (int i = bottom; i >= top && index < spiralList.Count; i--) spiralGrid[i, left] = spiralList[index++];

                left++;

            }

            var mergedDiagonals = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            for (int angle = 0; angle < 360; angle++)

            {

                double radians = angle * Math.PI / 180;

                double sin = Math.Sin(radians);

                double cos = Math.Cos(radians);

                for (int d = -size + 1; d < size; d++)

                {

                    var diagList = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

                    for (int x = 0; x < size; x++)

                    {

                        for (int y = 0; y < size; y++)

                        {

                            double proj = x * cos + y * sin;

                            if (Math.Round(proj) == d && spiralGrid[y, x] != null)

                            {

                                diagList.Add(spiralGrid[y, x]);

                            }

                        }

                    }

                    mergedDiagonals.AddRange(diagList);

                }

            }

            string outputPath = inputFile + "__SpiralSection_0_to_360_Diagonals.dataGridView___COMPOSER";

            RagaPaltas_OddEvenConcatenator.SaveNotesToFile(outputPath, mergedDiagonals);

            Console.WriteLine("Saved spiral diagonals to: " + outputPath);

        }

    }//public class RagaPaltas_SpiralDiagonal_merges_0_to_360_Composer

    public class RagaPaltas_DiagonalConcatenator

    {

        const string Separator = "######";

        const int MaxNotesPerFile = 5990;

        public static void GenerateDiagonalDecoratedFile(string inputFile)

        {

            var allNotes = LoadCleanNotesFromFile(inputFile);

            int n = allNotes.Count;

            Console.WriteLine("Loaded " + n + " clean notes.");

            // Create n x n matrix

            var grid = new List<List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>>();

            for (int i = 0; i < n; i++)

                grid.Add(CloneList(allNotes)); // Copy for each column

            var finalList = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            // Traverse diagonals: for sum d = 0 to 2n-2

            for (int d = 0; d <= 2 * (n - 1); d++)

            {

                var sublist = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

                for (int i = 0; i < n; i++)

                {

                    int j = d - i;

                    if (j >= 0 && j < n)

                    {

                        sublist.Add(CloneNote(grid[i][j]));

                    }// if (j >= 0 && j < n)

                }//for (int i = 0; i < n; i++)

                // Add direct diagonal

                finalList.AddRange(sublist);

                // Add reverse of diagonal

                sublist.Reverse();

                finalList.AddRange(sublist);

            }//for (int d = 0; d <= 2 * (n - 1); d++)

            SaveNotesToFile(inputFile + "__DiagonalDecorated_1_1___to___n_n_everystages_straights_and_reversed.dataGridView___COMPOSER", finalList);

        }

        public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadCleanNotesFromFile(string path)

        {

            var notes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            int lineIndex = 0;

            foreach (var line in File.ReadLines(path))

            {

                if (lineIndex++ == 0) continue; // skip header

                var parts = line.Split(new[] { Separator }, StringSplitOptions.None).Select(p => p.Trim()).ToArray();

                if (parts.Length < 22) continue;

                string indinote = parts[1];

                if (string.IsNullOrWhiteSpace(indinote) || indinote == "|" || indinote == "&" || indinote == "@" || indinote == "{" || indinote == "}" || indinote == "[" || indinote == "]" || indinote == "(" || indinote == ")")

                    continue;

                var note = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS();

                try { note.PUBLIC_STRING_THE_LYR_FOUND = parts[0]; } catch { note.PUBLIC_STRING_THE_LYR_FOUND = "LYR"; }

                try { note.PUBLIC_STRING_THE_INDINOTE_FOUND = parts[1]; } catch { note.PUBLIC_STRING_THE_INDINOTE_FOUND = "S"; }

                try { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = int.Parse(parts[2]); } catch { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = 60; }

                try { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = double.Parse(parts[3], CultureInfo.InvariantCulture); } catch { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 500; }

                try { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = int.Parse(parts[4]); } catch { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = 100; }

                try { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = int.Parse(parts[5]); } catch { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = 73; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = parts[6]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = "0,100"; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = parts[7]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = "8192,8192"; }

                try { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = int.Parse(parts[8]); } catch { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = 1; }

                try { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = int.Parse(parts[9]); } catch { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = 1; }

                try { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = double.Parse(parts[13], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = 0; }

                try { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = int.Parse(parts[14]); } catch { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = 0; }

                try { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = int.Parse(parts[15]); } catch { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = 0; }

                try { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = double.Parse(parts[16], CultureInfo.InvariantCulture); } catch { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = 0; }

                try { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = double.Parse(parts[17], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = 0; }

                try { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = double.Parse(parts[18], CultureInfo.InvariantCulture); } catch { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = 0; }

                try { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = double.Parse(parts[19], CultureInfo.InvariantCulture); } catch { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = 0; }

                try { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = int.Parse(parts[20]); } catch { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = 6; }

                try { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = int.Parse(parts[21]); } catch { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = 64; }

                notes.Add(note);

            }

            return notes;

        }

        private static PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS CloneNote(PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS note)

        {

            return new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS

            {

                PUBLIC_STRING_THE_LYR_FOUND = note.PUBLIC_STRING_THE_LYR_FOUND,

                PUBLIC_STRING_THE_INDINOTE_FOUND = note.PUBLIC_STRING_THE_INDINOTE_FOUND,

                INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127,

                DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY,

                INT_CURRENT_NOTES_VELOCITY_0_TO_127 = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127,

                INT_CURRENT_NOTES_PATCH_0_TO_127 = note.INT_CURRENT_NOTES_PATCH_0_TO_127,

                STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS,

                STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES,

                PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15,

                PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER,

                PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP,

                PUBLIC_INT___Column_JUERK_UP_PITCHBEND = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND,

                PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND,

                PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS,

                PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES,

                Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES,

                Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES,

                PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20,

                PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT

            };

        }

        private static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> CloneList(List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> list)

        {

            return list.Select(CloneNote).ToList();

        }

        public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

        {

            using (var writer = new StreamWriter(path))

            {

                foreach (var note in notes.Take(MaxNotesPerFile))

                {

                    var fields = new string[22];

                    fields[0] = note.PUBLIC_STRING_THE_LYR_FOUND;

                    fields[1] = note.PUBLIC_STRING_THE_INDINOTE_FOUND;

                    fields[2] = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127.ToString();

                    fields[3] = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY.ToString(CultureInfo.InvariantCulture);

                    fields[4] = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127.ToString();

                    fields[5] = note.INT_CURRENT_NOTES_PATCH_0_TO_127.ToString();

                    fields[6] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS;

                    fields[7] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES;

                    fields[8] = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15.ToString();

                    fields[9] = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER.ToString();

                    fields[10] = "to_fill";

                    fields[11] = "51.97";

                    fields[12] = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP.ToString(CultureInfo.InvariantCulture);

                    fields[13] = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND.ToString();

                    fields[14] = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND.ToString();

                    fields[15] = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS.ToString(CultureInfo.InvariantCulture);

                    fields[16] = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[17] = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[18] = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[19] = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20.ToString();

                    fields[20] = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT.ToString();

                    writer.WriteLine(string.Join(" " + Separator + " ", fields));

                }

            }

        }

    }// public class RagaPaltas_DiagonalConcatenator

    public class RagaPaltas_OddEvenConcatenator

    {

        const string Separator = "######";

        const int MaxNotesPerFile = 5990;

        public static void GenerateOddEvenRagaFile(string inputFile)

        {

            var allNotes = LoadCleanNotesFromFile(inputFile);

            Console.WriteLine("Loaded clean notes: " + allNotes.Count);

            int copies = 1;

            try

            {

                string response = Microsoft.VisualBasic.Interaction.InputBox("Enter number of copies to concatenate:", "Repeat Count", "1");

                copies = int.TryParse(response, out int result) ? Math.Max(1, result) : 1;

            }

            catch { copies = 1; }

            // Concatenate sequence n times

            var concatenated = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            for (int i = 0; i < copies; i++)

                concatenated.AddRange(CloneList(allNotes));

            // Separate odds and evens

            var oddNotes = concatenated.Where((n, idx) => idx % 2 == 1).ToList();

            var evenNotes = concatenated.Where((n, idx) => idx % 2 == 0).ToList();

            var finalList = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            finalList.AddRange(oddNotes);

            finalList.AddRange(evenNotes);

            SaveNotesToFile(inputFile + "__OddEvenDecorated.dataGridView___COMPOSER", finalList);

        }//public static void GenerateOddEvenRagaFile(string inputFile)

        public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadCleanNotesFromFile(string path)

        {

            var notes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            int lineIndex = 0;

            foreach (var line in File.ReadLines(path))

            {

                if (lineIndex++ == 0) continue; // skip header

                var parts = line.Split(new[] { Separator }, StringSplitOptions.None).Select(p => p.Trim()).ToArray();

                if (parts.Length < 22) continue;

                string indinote = parts[1];

                if (string.IsNullOrWhiteSpace(indinote) || indinote == "|" || indinote == "&" || indinote == "@" || indinote == "{" || indinote == "}" || indinote == "[" || indinote == "]" || indinote == "(" || indinote == ")")

                    continue;

                var note = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS();

                try { note.PUBLIC_STRING_THE_LYR_FOUND = parts[0]; } catch { note.PUBLIC_STRING_THE_LYR_FOUND = "LYR"; }

                try { note.PUBLIC_STRING_THE_INDINOTE_FOUND = parts[1]; } catch { note.PUBLIC_STRING_THE_INDINOTE_FOUND = "S"; }

                try { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = int.Parse(parts[2]); } catch { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = 60; }

                try { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = double.Parse(parts[3], CultureInfo.InvariantCulture); } catch { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 500; }

                try { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = int.Parse(parts[4]); } catch { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = 100; }

                try { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = int.Parse(parts[5]); } catch { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = 73; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = parts[6]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = "0,100"; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = parts[7]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = "8192,8192"; }

                try { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = int.Parse(parts[8]); } catch { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = 1; }

                try { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = int.Parse(parts[9]); } catch { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = 1; }

                try { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = double.Parse(parts[13], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = 0; }

                try { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = int.Parse(parts[14]); } catch { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = 0; }

                try { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = int.Parse(parts[15]); } catch { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = 0; }

                try { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = double.Parse(parts[16], CultureInfo.InvariantCulture); } catch { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = 0; }

                try { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = double.Parse(parts[17], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = 0; }

                try { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = double.Parse(parts[18], CultureInfo.InvariantCulture); } catch { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = 0; }

                try { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = double.Parse(parts[19], CultureInfo.InvariantCulture); } catch { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = 0; }

                try { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = int.Parse(parts[20]); } catch { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = 6; }

                try { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = int.Parse(parts[21]); } catch { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = 64; }

                notes.Add(note);

            }//foreach (var line in File.ReadLines(path))

            return notes;

        }// public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadCleanNotesFromFile(string path)

        public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> CloneList(List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> list)

        {

            return list.Select(note => new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS

            {

                PUBLIC_STRING_THE_LYR_FOUND = note.PUBLIC_STRING_THE_LYR_FOUND,

                PUBLIC_STRING_THE_INDINOTE_FOUND = note.PUBLIC_STRING_THE_INDINOTE_FOUND,

                INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127,

                DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY,

                INT_CURRENT_NOTES_VELOCITY_0_TO_127 = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127,

                INT_CURRENT_NOTES_PATCH_0_TO_127 = note.INT_CURRENT_NOTES_PATCH_0_TO_127,

                STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS,

                STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES,

                PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15,

                PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER,

                PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP,

                PUBLIC_INT___Column_JUERK_UP_PITCHBEND = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND,

                PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND,

                PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS,

                PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES,

                Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES,

                Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES,

                PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20,

                PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT

            }).ToList();

        }//  private static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> CloneList(List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> list)

        public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

        {

            using (var writer = new StreamWriter(path))

            {

                foreach (var note in notes.Take(MaxNotesPerFile))

                {

                    if(note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY<=0)

                    {

                        note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 3;

                    }//if(note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY<=0)

                    var fields = new string[22];

                    fields[0] = note.PUBLIC_STRING_THE_LYR_FOUND;

                    fields[1] = note.PUBLIC_STRING_THE_INDINOTE_FOUND;

                    fields[2] = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127.ToString();

                    fields[3] = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY.ToString(CultureInfo.InvariantCulture);

                    fields[4] = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127.ToString();

                    fields[5] = note.INT_CURRENT_NOTES_PATCH_0_TO_127.ToString();

                    fields[6] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS;

                    fields[7] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES;

                    fields[8] = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15.ToString();

                    fields[9] = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER.ToString();

                    fields[10] = "to_fill";

                    fields[11] = "51.97";

                    fields[12] = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP.ToString(CultureInfo.InvariantCulture);

                    fields[13] = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND.ToString();

                    fields[14] = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND.ToString();

                    fields[15] = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS.ToString(CultureInfo.InvariantCulture);

                    fields[16] = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[17] = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[18] = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[19] = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20.ToString();

                    fields[20] = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT.ToString();

                    writer.WriteLine(string.Join(" " + Separator + " ", fields));

                }//foreach (var note in notes.Take(MaxNotesPerFile))

            }//using (var writer = new StreamWriter(path))

        }// public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

    }//    public class RagaPaltas_OddEvenConcatenator

    // NEW CLASS: Handles grouping notes between | or @@, permutes durations, and writes chunks of 5990

    //////using System;

    //////using System.Collections.Generic;

    //////using System.Globalization;

    //////using System.IO;

    //////using System.Linq;

    public class RagaPaltasGroupwisePermuter_WithMeasureBoundaries

    {

        const string Separator = "######";

        const int MaxNotesPerFile = 5990;

        public static void GenerateRagaFiles_WithMeasurewiseDurationPermutations(string inputFile)

        {

            var allNotes = LoadNotesFromFile(inputFile);

            Console.WriteLine("Loaded base notes: " + allNotes.Count);

            var outputNotes = new List<List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>>();

            var currentChunk = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            outputNotes.Add(new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>(allNotes)); // Add original

            currentChunk.AddRange(allNotes);

            var groupedMeasures = new List<List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>>();

            var currentMeasure = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            for (int i = 0; i < allNotes.Count; i++)

            {

                var current = allNotes[i];

                currentMeasure.Add(current);

                bool isLast = i == allNotes.Count - 1;

                bool isPipe = current.PUBLIC_STRING_THE_LYR_FOUND == "|";

                bool isDoubleAt = i > 0 && allNotes[i - 1].PUBLIC_STRING_THE_LYR_FOUND == "@" && current.PUBLIC_STRING_THE_LYR_FOUND == "@";

                if (isPipe || isDoubleAt || isLast)

                {

                    groupedMeasures.Add(new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>(currentMeasure));

                    currentMeasure.Clear();

                }//if (isPipe || isDoubleAt || isLast)

            }//for (int i = 0; i < allNotes.Count; i++)

            int fileCounter = 1;

            int accumulatedNotes = allNotes.Count;

            foreach (var measure in groupedMeasures)

            {

                if (measure.Count <= 1) continue; // skip solo | or @

                var durations = measure.Select(n => n.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY).ToList();

                var permutations = GetPermutations(durations);

                foreach (var perm in permutations)

                {

                    var permuted = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

                    for (int i = 0; i < measure.Count; i++)

                    {

                        var copy = CloneNote(measure[i]);

                        copy.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = perm[i];

                        permuted.Add(copy);

                    }//for (int i = 0; i < measure.Count; i++)

                    if (accumulatedNotes + permuted.Count > MaxNotesPerFile)

                    {

                        SaveNotesToFile(inputFile + $"_measuresboundaried_PERMUTED_part{fileCounter}.dataGridView___COMPOSER", currentChunk);

                        fileCounter++;

                        currentChunk = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

                        accumulatedNotes = 0;

                    }//if (accumulatedNotes + permuted.Count > MaxNotesPerFile)

                    currentChunk.AddRange(permuted);

                    accumulatedNotes += permuted.Count;

                }//foreach (var perm in permutations)

            }//foreach (var measure in groupedMeasures)

            SaveNotesToFile(inputFile + $"_PERMUTED_part{fileCounter}.dataGridView___COMPOSER", currentChunk);

        }//public static void GenerateRagaFiles_WithMeasurewiseDurationPermutations(string inputFile)

        private static PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS CloneNote(PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS note)

        {

            return new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS

            {

                PUBLIC_STRING_THE_LYR_FOUND = note.PUBLIC_STRING_THE_LYR_FOUND,

                PUBLIC_STRING_THE_INDINOTE_FOUND = note.PUBLIC_STRING_THE_INDINOTE_FOUND,

                INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127,

                DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY,

                INT_CURRENT_NOTES_VELOCITY_0_TO_127 = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127,

                INT_CURRENT_NOTES_PATCH_0_TO_127 = note.INT_CURRENT_NOTES_PATCH_0_TO_127,

                STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS,

                STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES,

                PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15,

                PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER,

                PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP,

                PUBLIC_INT___Column_JUERK_UP_PITCHBEND = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND,

                PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND,

                PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS,

                PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES,

                Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES,

                Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES,

                PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20,

                PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT

            };

        }//private static PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS CloneNote(PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS note)

        private static List<List<double>> GetPermutations(List<double> list)

        {

            var result = new List<List<double>>();

            Permute(list, 0, result);

            return result;

        }

        private static void Permute(List<double> list, int start, List<List<double>> result)

        {

            if (start >= list.Count)

            {

                result.Add(new List<double>(list));

                return;

            }//if (start >= list.Count)

            for (int i = start; i < list.Count; i++)

            {

                (list[start], list[i]) = (list[i], list[start]);

                Permute(list, start + 1, result);

                (list[start], list[i]) = (list[i], list[start]);

            }//for (int i = start; i < list.Count; i++)

        }//private static void Permute(List<double> list, int start, List<List<double>> result)

        public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadNotesFromFile(string path)

        {

            var notes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            int lineIndex = 0;

            foreach (var line in File.ReadLines(path))

            {

                if (lineIndex++ == 0) continue; // skip header

                var parts = line.Split(new[] { Separator }, StringSplitOptions.None).Select(p => p.Trim()).ToArray();

                if (parts.Length < 22) continue;

                var note = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS();

                try { note.PUBLIC_STRING_THE_LYR_FOUND = parts[0]; } catch { note.PUBLIC_STRING_THE_LYR_FOUND = "LYR"; }

                try { note.PUBLIC_STRING_THE_INDINOTE_FOUND = parts[1]; } catch { note.PUBLIC_STRING_THE_INDINOTE_FOUND = "S"; }

                try { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = int.Parse(parts[2]); } catch { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = 60; }

                try { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = double.Parse(parts[3], CultureInfo.InvariantCulture); } catch { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 500; }

                try { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = int.Parse(parts[4]); } catch { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = 100; }

                try { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = int.Parse(parts[5]); } catch { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = 73; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = parts[6]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = "0,100"; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = parts[7]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = "8192,8192"; }

                try { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = int.Parse(parts[8]); } catch { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = 1; }

                try { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = int.Parse(parts[9]); } catch { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = 1; }

                try { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = double.Parse(parts[13], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = 0; }

                try { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = int.Parse(parts[14]); } catch { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = 0; }

                try { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = int.Parse(parts[15]); } catch { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = 0; }

                try { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = double.Parse(parts[16], CultureInfo.InvariantCulture); } catch { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = 0; }

                try { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = double.Parse(parts[17], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = 0; }

                try { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = double.Parse(parts[18], CultureInfo.InvariantCulture); } catch { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = 0; }

                try { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = double.Parse(parts[19], CultureInfo.InvariantCulture); } catch { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = 0; }

                try { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = int.Parse(parts[20]); } catch { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = 6; }

                try { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = int.Parse(parts[21]); } catch { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = 64; }

                notes.Add(note);

            }// foreach (var line in File.ReadLines(path))

            return notes;

        }//public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadNotesFromFile(string path)

        public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

        {

            using (var writer = new StreamWriter(path))

            {

                foreach (var note in notes.Take(MaxNotesPerFile))

                {

                    if (note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY <= 0)

                    {

                        note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 3;

                    }//if(note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY<=0)

                    var fields = new string[22];

                    fields[0] = note.PUBLIC_STRING_THE_LYR_FOUND;

                    fields[1] = note.PUBLIC_STRING_THE_INDINOTE_FOUND;

                    fields[2] = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127.ToString();

                    fields[3] = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY.ToString(CultureInfo.InvariantCulture);

                    fields[4] = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127.ToString();

                    fields[5] = note.INT_CURRENT_NOTES_PATCH_0_TO_127.ToString();

                    fields[6] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS;

                    fields[7] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES;

                    fields[8] = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15.ToString();

                    fields[9] = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER.ToString();

                    fields[10] = "to_fill";

                    fields[11] = "51.97";

                    fields[12] = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP.ToString(CultureInfo.InvariantCulture);

                    fields[13] = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND.ToString();

                    fields[14] = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND.ToString();

                    fields[15] = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS.ToString(CultureInfo.InvariantCulture);

                    fields[16] = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[17] = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[18] = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES.ToString(CultureInfo.InvariantCulture);

                    fields[19] = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20.ToString();

                    fields[20] = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT.ToString();

                    writer.WriteLine(string.Join(" " + Separator + " ", fields));

                }//foreach (var note in notes.Take(MaxNotesPerFile))

            }//using (var writer = new StreamWriter(path))

        }//public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

    }//public class RagaPaltasGroupwisePermuter_WithMeasureBoundaries

    //////using System;

    //////using System.Collections.Generic;

    //////using System.Globalization;

    //////using System.IO;

    //////using System.Linq;

    public class RagaPaltasGenerator___PERMUTED_DURATIONS_SEQUENCES_COPIERS_reading_the___dataGridView___COMPOSER___generates_another___dataGridView___COMPOSER

    {

        const string Separator = "######";

        public static void GenerateExtendedRagaFile___ALL_THE_NOTES_WITH_PERMUTED_DURATIONS_OF_OTHER_NOTES(string inputFile, string outputFile)

        {

            var baseNotes = LoadNotesFromFile(inputFile);

            if (baseNotes.Count == 0)

            {

                Console.WriteLine("No valid notes found in input file.");

                System.Windows.Forms.MessageBox.Show("No valid notes found in input file.");

                return;

            }//if (baseNotes.Count == 0)

            if (baseNotes.Count >= 9)

            {

                System.Windows.Forms.MessageBox.Show("Will note do permutations if the basenotes count >=9 ");

                return;

            }//if(baseNotes.Count>=9)

            var outputNotes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            var allDurPermutations = GetPermutations(baseNotes.Select(n => n.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY).ToList());

            int logging_counter = 0;

            foreach (var durationSet in allDurPermutations)

            {

                for (int i = 0; i < baseNotes.Count; i++)

                {

                    var note = baseNotes[i];

                    var newNote = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS

                    {

                        PUBLIC_STRING_THE_LYR_FOUND = note.PUBLIC_STRING_THE_LYR_FOUND,

                        PUBLIC_STRING_THE_INDINOTE_FOUND = note.PUBLIC_STRING_THE_INDINOTE_FOUND,

                        INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127,

                        DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = durationSet[i],

                        INT_CURRENT_NOTES_VELOCITY_0_TO_127 = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127,

                        INT_CURRENT_NOTES_PATCH_0_TO_127 = note.INT_CURRENT_NOTES_PATCH_0_TO_127,

                        STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS,

                        STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES,

                        PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15,

                        PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER,

                        PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP,

                        PUBLIC_INT___Column_JUERK_UP_PITCHBEND = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND,

                        PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND,

                        PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS,

                        PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES,

                        Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES,

                        Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES,

                        PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20,

                        PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT

                    };

                    logging_counter++;

                    if(logging_counter<5990)

                    {

                        outputNotes.Add(newNote);

                    }// if(logging_counter<5990)

                }//for (int i = 0; i < baseNotes.Count; i++)

            }//foreach (var durationSet in allDurPermutations)

            SaveNotesToFile(outputFile, outputNotes);

        }

        public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadNotesFromFile(string path)

        {

            var notes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            int lines_number_in_files = 0;

            foreach (var line in File.ReadLines(path))

            {

                if(lines_number_in_files>0)

                {

                    //not to load the header lines

                var parts = line.Split(new[] { Separator }, StringSplitOptions.None).Select(p => p.Trim()).ToArray();

                if (parts.Length < 22) continue;

                var note = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS();

                try { note.PUBLIC_STRING_THE_LYR_FOUND = parts[0]; } catch { note.PUBLIC_STRING_THE_LYR_FOUND = "LYR"; }

                try { note.PUBLIC_STRING_THE_INDINOTE_FOUND = parts[1]; } catch { note.PUBLIC_STRING_THE_INDINOTE_FOUND = "S"; }

                try { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = int.Parse(parts[2]); } catch { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = 60; }

                try { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = double.Parse(parts[3], CultureInfo.InvariantCulture); } catch { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 500; }

                try { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = int.Parse(parts[4]); } catch { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = 100; }

                try { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = int.Parse(parts[5]); } catch { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = 73; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = parts[6]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = "0,100"; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = parts[7]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = "8192,8192"; }

                try { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = int.Parse(parts[8]); } catch { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = 1; }

                try { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = int.Parse(parts[9]); } catch { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = 1; }

                try { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = double.Parse(parts[13], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = 0; }

                try { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = int.Parse(parts[14]); } catch { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = 0; }

                try { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = int.Parse(parts[15]); } catch { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = 0; }

                try { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = double.Parse(parts[16], CultureInfo.InvariantCulture); } catch { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = 0; }

                try { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = double.Parse(parts[17], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = 0; }

                try { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = double.Parse(parts[18], CultureInfo.InvariantCulture); } catch { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = 0; }

                try { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = double.Parse(parts[19], CultureInfo.InvariantCulture); } catch { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = 0; }

                try { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = int.Parse(parts[20]); } catch { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = 6; }

                try { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = int.Parse(parts[21]); } catch { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = 64; }

                notes.Add(note);

                }//if(lines_number_in_files>0)

                lines_number_in_files++;

            }

            return notes;

        }

        public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

        {

            int permuted_notes_counter = 0;

            System.Windows.Forms.MessageBox.Show("Total permuted durations notes count = " + notes.Count + "   we will save only 5990 notes");

            using (var writer = new StreamWriter(path))

            {

                foreach (var note in notes)

                {

                    permuted_notes_counter++;

                    if(permuted_notes_counter<5990)

                    {

                        if (note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY <= 0)

                        {

                            note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 3;

                        }//if(note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY<=0)

                        var fields = new string[22];

                    try { fields[0] = note.PUBLIC_STRING_THE_LYR_FOUND ?? "LYR"; } catch { fields[0] = "LYR"; }

                    try { fields[1] = note.PUBLIC_STRING_THE_INDINOTE_FOUND ?? "S"; } catch { fields[1] = "S"; }

                    try { fields[2] = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127.ToString(); } catch { fields[2] = "60"; }

                    try { fields[3] = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY.ToString(CultureInfo.InvariantCulture); } catch { fields[3] = "500"; }

                    try { fields[4] = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127.ToString(); } catch { fields[4] = "100"; }

                    try { fields[5] = note.INT_CURRENT_NOTES_PATCH_0_TO_127.ToString(); } catch { fields[5] = "73"; }

                    try { fields[6] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS ?? "0,100"; } catch { fields[6] = "0,100"; }

                    try { fields[7] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES ?? "8192,8192"; } catch { fields[7] = "8192,8192"; }

                    try { fields[8] = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15.ToString(); } catch { fields[8] = "1"; }

                    try { fields[9] = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER.ToString(); } catch { fields[9] = "1"; }

                    fields[10] = "to_fill";

                    fields[11] = "51.97";

                    try { fields[12] = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP.ToString(CultureInfo.InvariantCulture); } catch { fields[12] = "0"; }

                    try { fields[13] = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND.ToString(); } catch { fields[13] = "0"; }

                    try { fields[14] = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND.ToString(); } catch { fields[14] = "0"; }

                    try { fields[15] = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS.ToString(CultureInfo.InvariantCulture); } catch { fields[15] = "0"; }

                    try { fields[16] = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES.ToString(CultureInfo.InvariantCulture); } catch { fields[16] = "0"; }

                    try { fields[17] = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES.ToString(CultureInfo.InvariantCulture); } catch { fields[17] = "0"; }

                    try { fields[18] = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES.ToString(CultureInfo.InvariantCulture); } catch { fields[18] = "0"; }

                    try { fields[19] = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20.ToString(); } catch { fields[19] = "6"; }

                    try { fields[20] = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT.ToString(); } catch { fields[20] = "64"; }

                    writer.WriteLine(string.Join(" " + Separator + " ", fields));

                    }//if(permuted_notes_counter<5990)

                }//foreach (var note in notes)

            }

        }

        private static List<List<double>> GetPermutations(List<double> list)

        {

            var result = new List<List<double>>();

            Permute(list, 0, result);

            return result;

        }// private static List<List<double>> GetPermutations(List<double> list)

        private static void Permute(List<double> list, int start, List<List<double>> result)

        {

            if (start >= list.Count)

            {

                result.Add(new List<double>(list));

                return;

            }

            for (int i = start; i < list.Count; i++)

            {

                (list[start], list[i]) = (list[i], list[start]);

                Permute(list, start + 1, result);

                (list[start], list[i]) = (list[i], list[start]);

            }

        }

        // LoadNotesFromFile and SaveNotesToFile remain unchanged (already includes try-catch)

    } // class end

    //////using System;

    //////using System.Collections.Generic;

    //////using System.Globalization;

    //////using System.IO;

    //////using System.Linq;

    public class RagaPaltasGenerator___reading_the___dataGridView___COMPOSER___generates_another___dataGridView___COMPOSER

    {

        const string Separator = "######";

        public static void GenerateExtendedRagaFile___ALL_THE_NOTES_WITH_SAMES_DURATIONS_OF_OTHER_NOTES(string inputFile, string outputFile)

        {

            var baseNotes = LoadNotesFromFile(inputFile);

            if (baseNotes.Count == 0)

            {

                Console.WriteLine("No valid notes found in input file.");

                return;

            }

            var outputNotes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            foreach (var donorNote in baseNotes)

            {

                foreach (var recipientNote in baseNotes)

                {

                    var cloneList = baseNotes.Select(note => new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS

                    {

                        PUBLIC_STRING_THE_LYR_FOUND = note.PUBLIC_STRING_THE_LYR_FOUND,

                        PUBLIC_STRING_THE_INDINOTE_FOUND = note.PUBLIC_STRING_THE_INDINOTE_FOUND,

                        INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127,

                        DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = donorNote.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY,

                        INT_CURRENT_NOTES_VELOCITY_0_TO_127 = recipientNote.INT_CURRENT_NOTES_VELOCITY_0_TO_127,

                        INT_CURRENT_NOTES_PATCH_0_TO_127 = note.INT_CURRENT_NOTES_PATCH_0_TO_127,

                        STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS,

                        STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES,

                        PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15,

                        PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER,

                        PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP,

                        PUBLIC_INT___Column_JUERK_UP_PITCHBEND = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND,

                        PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND,

                        PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS,

                        PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES,

                        Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES,

                        Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES,

                        PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20,

                        PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT

                    }).ToList();

                    outputNotes.AddRange(cloneList);

                }

            }

            SaveNotesToFile(outputFile, outputNotes);

        }

        public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadNotesFromFile(string path)

        {

            var notes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            foreach (var line in File.ReadLines(path))

            {

                var parts = line.Split(new[] { Separator }, StringSplitOptions.None).Select(p => p.Trim()).ToArray();

                if (parts.Length < 22) continue;

                var note = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS();

                try { note.PUBLIC_STRING_THE_LYR_FOUND = parts[0]; } catch { note.PUBLIC_STRING_THE_LYR_FOUND = "LYR"; }

                try { note.PUBLIC_STRING_THE_INDINOTE_FOUND = parts[1]; } catch { note.PUBLIC_STRING_THE_INDINOTE_FOUND = "S"; }

                try { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = int.Parse(parts[2]); } catch { note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = 60; }

                try { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = double.Parse(parts[3], CultureInfo.InvariantCulture); } catch { note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 500; }

                try { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = int.Parse(parts[4]); } catch { note.INT_CURRENT_NOTES_VELOCITY_0_TO_127 = 100; }

                try { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = int.Parse(parts[5]); } catch { note.INT_CURRENT_NOTES_PATCH_0_TO_127 = 73; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = parts[6]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = "0,100"; }

                try { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = parts[7]; } catch { note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = "8192,8192"; }

                try { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = int.Parse(parts[8]); } catch { note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = 0; }

                try { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = int.Parse(parts[9]); } catch { note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = 0; }

                try { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = double.Parse(parts[13], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = 0; }

                try { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = int.Parse(parts[14]); } catch { note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND = 0; }

                try { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = int.Parse(parts[15]); } catch { note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = 0; }

                try { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = double.Parse(parts[16], CultureInfo.InvariantCulture); } catch { note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = 0; }

                try { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = double.Parse(parts[17], CultureInfo.InvariantCulture); } catch { note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = 0; }

                try { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = double.Parse(parts[18], CultureInfo.InvariantCulture); } catch { note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = 0; }

                try { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = double.Parse(parts[19], CultureInfo.InvariantCulture); } catch { note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = 0; }

                try { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = int.Parse(parts[20]); } catch { note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = 6; }

                try { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = int.Parse(parts[21]); } catch { note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = 64; }

                notes.Add(note);

            }

            return notes;

        }

        public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

        {

            using (var writer = new StreamWriter(path))

            {

                foreach (var note in notes)

                {

                    if (note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY <= 0)

                    {

                        note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 3;

                    }//if(note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY<=0)

                    var fields = new string[22];

                    try { fields[0] = note.PUBLIC_STRING_THE_LYR_FOUND ?? "LYR"; } catch { fields[0] = "LYR"; }

                    try { fields[1] = note.PUBLIC_STRING_THE_INDINOTE_FOUND ?? "S"; } catch { fields[1] = "S"; }

                    try { fields[2] = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127.ToString(); } catch { fields[2] = "60"; }

                    try { fields[3] = note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY.ToString(CultureInfo.InvariantCulture); } catch { fields[3] = "500"; }

                    try { fields[4] = note.INT_CURRENT_NOTES_VELOCITY_0_TO_127.ToString(); } catch { fields[4] = "100"; }

                    try { fields[5] = note.INT_CURRENT_NOTES_PATCH_0_TO_127.ToString(); } catch { fields[5] = "73"; }

                    try { fields[6] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS ?? "0,100"; } catch { fields[6] = "0,100"; }

                    try { fields[7] = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES ?? "8192,8192"; } catch { fields[7] = "8192,8192"; }

                    try { fields[8] = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15.ToString(); } catch { fields[8] = "0"; }

                    try { fields[9] = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER.ToString(); } catch { fields[9] = "0"; }

                    fields[10] = "to_fill";

                    fields[11] = "51.97";

                    try { fields[12] = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP.ToString(CultureInfo.InvariantCulture); } catch { fields[12] = "0"; }

                    try { fields[13] = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND.ToString(); } catch { fields[13] = "0"; }

                    try { fields[14] = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND.ToString(); } catch { fields[14] = "0"; }

                    try { fields[15] = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS.ToString(CultureInfo.InvariantCulture); } catch { fields[15] = "0"; }

                    try { fields[16] = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES.ToString(CultureInfo.InvariantCulture); } catch { fields[16] = "0"; }

                    try { fields[17] = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES.ToString(CultureInfo.InvariantCulture); } catch { fields[17] = "0"; }

                    try { fields[18] = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES.ToString(CultureInfo.InvariantCulture); } catch { fields[18] = "0"; }

                    try { fields[19] = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20.ToString(); } catch { fields[19] = "6"; }

                    try { fields[20] = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT.ToString(); } catch { fields[20] = "64"; }

                    writer.WriteLine(string.Join(" " + Separator + " ", fields));

                }

            }

        }

    } // class end

    //////using System;

    //////using System.Collections.Generic;

    //////using System.Globalization;

    //////using System.IO;

    //////using System.Linq;

    public class DISCARDING___NO_TRYCATCH_WAS_THERE___RagaPaltasGenerator___reading_the___dataGridView___COMPOSER___generates_another___dataGridView___COMPOSER

    {

        const string Separator = "######";

        public static void GenerateExtendedRagaFile(string inputFile, string outputFile)

        {

            var baseNotes = LoadNotesFromFile(inputFile);

            if (baseNotes.Count == 0)

            {

                Console.WriteLine("No valid notes found in input file.");

                System.Windows.Forms.MessageBox.Show("No valid notes found in input file.");

                return;

            }// if (baseNotes.Count == 0)

            var outputNotes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            foreach (var donorNote in baseNotes)

            {

                foreach (var recipientNote in baseNotes)

                {

                    var cloneList = baseNotes.Select(note => new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS

                    {

                        PUBLIC_STRING_THE_LYR_FOUND = note.PUBLIC_STRING_THE_LYR_FOUND,

                        PUBLIC_STRING_THE_INDINOTE_FOUND = note.PUBLIC_STRING_THE_INDINOTE_FOUND,

                        INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127,

                        DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = donorNote.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY,

                        INT_CURRENT_NOTES_VELOCITY_0_TO_127 = recipientNote.INT_CURRENT_NOTES_VELOCITY_0_TO_127,

                        INT_CURRENT_NOTES_PATCH_0_TO_127 = note.INT_CURRENT_NOTES_PATCH_0_TO_127,

                        STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS,

                        STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES,

                        PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15,

                        PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER,

                        PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP,

                        PUBLIC_INT___Column_JUERK_UP_PITCHBEND = note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND,

                        PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND,

                        PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS,

                        PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES,

                        Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES,

                        Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES,

                        PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20,

                        PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT

                    }).ToList();

                    outputNotes.AddRange(cloneList);

                }//foreach (var recipientNote in baseNotes)

            }//foreach (var donorNote in baseNotes)

            SaveEXTENDED_RAGAPALTAS_NotesToFile(outputFile, outputNotes);

        }//public static void GenerateExtendedRagaFile(string inputFile, string outputFile)

        public static List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> LoadNotesFromFile(string path)

        {

            var notes = new List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS>();

            foreach (var line in File.ReadLines(path))

            {

                var parts = line.Split(new[] { Separator }, StringSplitOptions.None).Select(p => p.Trim()).ToArray();

                if (parts.Length < 22) continue;

                try

                {

                    var note = new PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS

                    {

                        PUBLIC_STRING_THE_LYR_FOUND = parts[0],

                        PUBLIC_STRING_THE_INDINOTE_FOUND = parts[1],

                        INT_NOTE_NUMBER_TO_PLAY_0_TO_127 = int.Parse(parts[2]),

                        DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = double.Parse(parts[3], CultureInfo.InvariantCulture),

                        INT_CURRENT_NOTES_VELOCITY_0_TO_127 = int.Parse(parts[4]),

                        INT_CURRENT_NOTES_PATCH_0_TO_127 = int.Parse(parts[5]),

                     //   STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS = parts[6],

                    //    STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES = parts[7],

                        PUBLIC_INT_CHANNEL_NUMBER_0_TO_15 = int.Parse(parts[8]),

                        PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER = int.Parse(parts[9]),

                    //    PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP = double.Parse(parts[13], CultureInfo.InvariantCulture),

                   //     PUBLIC_INT___Column_JUERK_UP_PITCHBEND = int.Parse(parts[14]),

                   //     PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND = int.Parse(parts[15]),

                  //      PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS = double.Parse(parts[16], CultureInfo.InvariantCulture),

                    //    PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES = double.Parse(parts[17], CultureInfo.InvariantCulture),

                    //    Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES = double.Parse(parts[18], CultureInfo.InvariantCulture),

                      //  Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES = double.Parse(parts[19], CultureInfo.InvariantCulture),

                     //   PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20 = int.Parse(parts[20]),

                     //   PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT = int.Parse(parts[21])

                    };

                    notes.Add(note);

                    Console.WriteLine("populated " + line);

                }

                catch

                {

                    // Handle malformed row

                    continue;

                }

            }

            return notes;

        }

        public static void SaveEXTENDED_RAGAPALTAS_NotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

        {

            using (var writer = new StreamWriter(path))

            {

                foreach (var note in notes)

                {

                    if (note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY <= 0)

                    {

                        note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY = 3;

                    }//if(note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY<=0)

                    writer.WriteLine(string.Join(" " + Separator + " ", new[]

                    {

                    note.PUBLIC_STRING_THE_LYR_FOUND,

                    note.PUBLIC_STRING_THE_INDINOTE_FOUND,

                    note.INT_NOTE_NUMBER_TO_PLAY_0_TO_127.ToString(),

                    note.DOUBLE_MILLISECOND_DURATION_FOR_THE_NOTE_TO_PLAY.ToString(CultureInfo.InvariantCulture),

                    note.INT_CURRENT_NOTES_VELOCITY_0_TO_127.ToString(),

                    note.INT_CURRENT_NOTES_PATCH_0_TO_127.ToString(),

                    note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_PERCENTAGES_DURATIONS,

                    note.STRING_COMMA_SEPERATED_WITHIN_NOTES_PITCH_BENDS_VALUES,

                    note.PUBLIC_INT_CHANNEL_NUMBER_0_TO_15.ToString(),

                    note.PUBLIC_INT_TRACK_NUMBER_0_TO_ANY_NUMBER.ToString(),

                    "to_fill", // NOTES_NUMBERS placeholder

                    "51.97", // NOTES_FREQUENCYS placeholder

                    note.PUBLIC_DOUBLE____Column_PITCHBEND_JERKS_MILLIS_GAP.ToString(CultureInfo.InvariantCulture),

                    note.PUBLIC_INT___Column_JUERK_UP_PITCHBEND.ToString(),

                    note.PUBLIC_INT___Column_JERK_DOWNS_PITCH_BEND.ToString(),

                    note.PUBIC_DOUBLE_ENFORCER_START_TIMES_MILLIS_FOR_DECORATIONS.ToString(CultureInfo.InvariantCulture),

                    note.PUBLIC_DOUBLE___Column___ENFORCED_START_MILLIS_FOR_PERCUSSIONS_NOTES.ToString(CultureInfo.InvariantCulture),

                    note.Column___ENFORCED_START_MILLIS_FOR_PUREMELODY_NOTES.ToString(CultureInfo.InvariantCulture),

                    note.Column___REFERENCE_CUMULATIVE_START_MILLIS_FOR_CURRENT_NOTES.ToString(CultureInfo.InvariantCulture),

                    note.PUBLIC_INT___Column___NOTE_WISE_PITHBENDS_RANGE_2X2_SEMITONES_DEFAULT_TO_10X2_20.ToString(),

                    note.PUBLIC_INT___Column_NOTES_WISE_PAN_0_LEFT_TO_127_RIGHT.ToString()

                }));

                }//foreach (var note in notes)

            }//using (var writer = new StreamWriter(path))

        }//public static void SaveNotesToFile(string path, List<PUBLIC_CLASS_TO_LOAD_FOR_PRELISTENS_SINGLE_ROWS_NOTE_DATA_DETAILS> notes)

    } // class end public class RagaPaltasGenerator

    /// <summary>

    /// /////////////////////////////////////////////////////////////////////////////////////////////////////

    /// </summary>

//////using System;

//////using System.Collections.Generic;

//////using System.Text;

public class WaterDistributor___OR_MILLIS_DISTRIBUTIONS

    {

        public static StringBuilder PUBLIC_STATIC_STRINGBUILDER_FOR_WATER_DISTRIBUTIONS_MILLIS_DISTRIBUTIONS_REPORTS = new StringBuilder();

        public static StringBuilder PUBLIC_STATIC_STRINGBUILDER_FOR_WATER_OR_MILLIS_ALLOCATED_TOKENS = new StringBuilder();

        class Node

        {

            public string Symbol;

            public List<Node> Children = new List<Node>();

            public double Water_OR_MILLIS = 0;

            public bool IsFixedToken = false; // to mark special characters for fixed allocation

        }

        public static void WaterDistributor___MILLIS_DISTRIBUTIONS_Main(string input_string_for_whole_forest, double total_water_or_total_millis_W_for_each_tree_pipes_delimeted)

        {

            PUBLIC_STATIC_STRINGBUILDER_FOR_WATER_DISTRIBUTIONS_MILLIS_DISTRIBUTIONS_REPORTS.Clear();

            PUBLIC_STATIC_STRINGBUILDER_FOR_WATER_OR_MILLIS_ALLOCATED_TOKENS.Clear();

            string input = input_string_for_whole_forest;

            PUBLIC_STATIC_STRINGBUILDER_FOR_WATER_DISTRIBUTIONS_MILLIS_DISTRIBUTIONS_REPORTS

                .AppendLine("Input string:\n" + input + "\nTotal millis per tree: " + total_water_or_total_millis_W_for_each_tree_pipes_delimeted);

            var trees = ParseForest(input);

            double waterPerTree = total_water_or_total_millis_W_for_each_tree_pipes_delimeted;

            foreach (var tree in trees)

                DistributeWater(tree, waterPerTree);

            foreach (var tree in trees)

                PrintWaterDistribution(tree, "ROOT");

        }

        static List<Node> ParseForest(string input)

        {

            var trees = new List<Node>();

            var treeStrings = input.Split('|');

            foreach (var treeStr in treeStrings)

            {

                string trimmed = treeStr.Trim();

                if (!string.IsNullOrEmpty(trimmed))

                {

                    var tokens = Tokenize(trimmed);

                    int index = 0;

                    var root = new Node { Symbol = "ROOT" };

                    while (index < tokens.Count)

                    {

                        root.Children.Add(ParseNode(tokens, ref index));

                    }

                    trees.Add(root);

                }

            }

            return trees;

        }

        static List<string> Tokenize(string input)

        {

            var tokens = new List<string>();

            string current = "";

            foreach (char c in input)

            {

                if (c == '(' || c == ')')

                {

                    if (!string.IsNullOrWhiteSpace(current))

                    {

                        tokens.AddRange(current.Trim().Split(' '));

                        current = "";

                    }

                    tokens.Add(c.ToString());

                }

                else

                {

                    current += c;

                }

            }

            if (!string.IsNullOrWhiteSpace(current))

            {

                tokens.AddRange(current.Trim().Split(' '));

            }

            return tokens;

        }

        static Node ParseNode(List<string> tokens, ref int index)

        {

            if (tokens[index] == "(")

            {

                index++;

                var parent = new Node { Symbol = "BRANCH" };

                while (index < tokens.Count && tokens[index] != ")")

                {

                    parent.Children.Add(ParseNode(tokens, ref index));

                }

                index++;

                return parent;

            }

            else

            {

                string sym = tokens[index++];

                return new Node

                {

                    Symbol = sym,

                    IsFixedToken = sym == "|" || sym == "@" || sym == "[" || sym == "]" || sym == "{" || sym == "}" || sym == ";" || sym == "," || sym == "~" || sym == "!" || sym == "" || sym == "^" || sym == "&"

                };

            }

        }

        static void DistributeWater(Node node, double water)

        {

            if (node.Children.Count == 0)

            {

                node.Water_OR_MILLIS = node.IsFixedToken ? 30.0 : water;

                return;

            }

            int fixedCount = 0;

            double remainingWater = water;

            foreach (var child in node.Children)

            {

                if (child.IsFixedToken)

                    fixedCount++;

            }

            double fixedAllocation = 30.0 * fixedCount;

            double distributable = Math.Max(0, water - fixedAllocation);

            int nonFixedCount = node.Children.Count - fixedCount;

            double perNode = nonFixedCount > 0 ? distributable / nonFixedCount : 0;

            foreach (var child in node.Children)

            {

                if (child.IsFixedToken)

                    DistributeWater(child, 30.0);

                else

                    DistributeWater(child, perNode);

            }

            node.Water_OR_MILLIS = water;

        }

        static void PrintWaterDistribution(Node node, string path)

        {

            if (node.Symbol != "ROOT" && node.Symbol != "BRANCH")

            {

                Console.WriteLine($"{path}/{node.Symbol} -> {node.Water_OR_MILLIS:F2} milliseconds");

                PUBLIC_STATIC_STRINGBUILDER_FOR_WATER_DISTRIBUTIONS_MILLIS_DISTRIBUTIONS_REPORTS

                    .AppendLine($"{path}/{node.Symbol} -> {node.Water_OR_MILLIS:F2} milliseconds");

                PUBLIC_STATIC_STRINGBUILDER_FOR_WATER_OR_MILLIS_ALLOCATED_TOKENS

                    .AppendLine(node.Symbol + "_DISTRIBUTED_" + node.Water_OR_MILLIS.ToString("F2"));

            }

            foreach (var child in node.Children)

            {

                PrintWaterDistribution(child, path + "/" + (node.Symbol == "ROOT" ? "" : node.Symbol));

            }

        }

    } // class end

No comments:

Post a Comment