Beispiel #1
0
        /// <summary>
        /// Generate notes from the board
        /// </summary>
        /// <returns></returns>
        private List <Note> GenerateNotes()
        {
            pbProgress.Visible = true;
            lblStatus.Text     = "Generating...";

            // determine ending value and condition
            int nrOfStepsToProcess = (int)nudNumberOfSteps.Value;
            int nrOfNotesToPlay    = (int)nudNumberOfNotes.Value;
            int nrOfMsToPass       = (int)nudTimeElapsed.Value * 1000;

            ExportConditionEnum condition = ExportConditionEnum.TimeLimit;

            if (rdbNumberOfNotes.Checked)
            {
                condition = ExportConditionEnum.NoteLimit;
            }
            else if (rdbNumberOfSteps.Checked)
            {
                condition = ExportConditionEnum.StepLimit;
            }
            else if (rdbTimeElapsed.Checked)
            {
                condition = ExportConditionEnum.TimeLimit;
            }

            // keep track of steps since last note to prevent infinite loop
            int stepsSinceLastNote = 0;

            int curStep      = 0;
            int curNoteCount = 0;
            int curMsPassed  = 0;

            DateTime startTime = DateTime.Now;

            // take a deep copy of the board settings (don't want to alter the current board)
            BoardSettings boardsettings;

            if (!BoardMapper.TryGetBoardSettingsFromString(BoardMapper.GetStringFromBoardSettings(boardSettings), out boardsettings))
            {
                MessageBox.Show("Could not create a copy of the current board", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(null);
            }

            List <Note> notes = new List <Note>();
            double      progress;

            // continue advancing to next state until either cancelled or condition is met
            while (!cancelGenerating && !ExportConditionMet(condition, curStep, curNoteCount, curMsPassed, nrOfStepsToProcess, nrOfNotesToPlay, nrOfMsToPass, out progress))
            {
                // advance board
                boardsettings.Board.NextState();

                // get the active notes of the board
                var activeNotes = GetNotesForActiveCells(boardsettings);
                // and update the correct time played
                foreach (var n in activeNotes)
                {
                    n.TimeDown = startTime.AddMilliseconds(curMsPassed);
                }

                // and add them to the notes list
                notes.AddRange(activeNotes);

                curStep++;
                curNoteCount += activeNotes.Count;
                curMsPassed  += boardsettings.Speed;

                // check steps since last note
                if (activeNotes.Count == 0)
                {
                    stepsSinceLastNote++;
                }
                else
                {
                    stepsSinceLastNote = 0;
                }

                // prevent infinite loop when no notes are played anymore, ask user to continue
                if (stepsSinceLastNote > 10000)
                {
                    DialogResult result = MessageBox.Show("There have been no notes for 10000 steps now, do you want to continue generating?", "No notes for a long time", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == System.Windows.Forms.DialogResult.No)
                    {
                        break;
                    }
                    else
                    {
                        stepsSinceLastNote = 0; // reset steps since last note
                    }
                }

                // update gui each 100 steps
                if (curStep % 100 == 0)
                {
                    pbProgress.Value = (int)(progress * 100);
                    lblStatus.Text   = "Generating... | Current iteration " + curStep;
                    Application.DoEvents();
                }
            }

            pbProgress.Visible = false;

            if (notes.Count <= 0)
            {
                lblStatus.Text = "No midi generated, there weren't any notes to record";
            }
            else
            {
                lblStatus.Text = "Midi generated";
            }

            return(notes);
        }