Пример #1
0
        /// <summary>
        /// Bind behavior.
        /// </summary>
        /// <param name="simulation">The simulation.</param>
        /// <param name="context">The context.</param>
        public override void Bind(Simulation simulation, BindingContext context)
        {
            base.Bind(simulation, context);

            // Get parameters
            NoiseParameters = context.GetParameterSet <ModelNoiseParameters>("model");

            _state = ((Noise)simulation).NoiseState;
        }
Пример #2
0
        private void Export_Click(object sender, EventArgs e)
        {
            //acquire target
            using var sfd = new SaveFileDialog
                  {
                      Filter = new FilesystemFilter("Renoise Song Files", new[] { "xrns" }).ToString()
                  };
            if (sfd.ShowDialog().IsOk())
            {
                return;
            }

            // configuration:
            var    outPath                 = sfd.FileName;
            string templatePath            = Path.Combine(Path.GetDirectoryName(outPath) ?? "", "template.xrns");
            int    configuredPatternLength = int.Parse(txtPatternLength.Text);


            // load template
            XElement templateRoot;

            using (var zfTemplate = new ZipArchive(new FileStream(templatePath, FileMode.Open, FileAccess.Read), ZipArchiveMode.Read))
            {
                var entry = zfTemplate.Entries.Single(entry => entry.FullName == "Song.xml");
                using var stream = entry.Open();
                templateRoot     = XElement.Load(stream);
            }

            //get the pattern pool, and whack the child nodes
            var xPatterns    = templateRoot.XPathSelectElement("//Patterns");
            var xPatternPool = xPatterns.Parent;

            xPatterns.Remove();

            var writer = new StringWriter();

            writer.WriteLine("<Patterns>");


            int pulse0LastNote = -1;
            int pulse0LastType = -1;
            int pulse1LastNote = -1;
            int pulse1LastType = -1;
            int triLastNote    = -1;
            int noiseLastNote  = -1;

            int patternCount = 0;
            int time         = 0;

            while (time < _log.Count)
            {
                patternCount++;

                //begin writing pattern: open the tracks list
                writer.WriteLine("<Pattern>");
                writer.WriteLine("<NumberOfLines>{0}</NumberOfLines>", configuredPatternLength);
                writer.WriteLine("<Tracks>");

                //write the pulse tracks
                for (int track = 0; track < 2; track++)
                {
                    writer.WriteLine("<PatternTrack type=\"PatternTrack\">");
                    writer.WriteLine("<Lines>");

                    int lastNote = track == 0 ? pulse0LastNote : pulse1LastNote;
                    int lastType = track == 0 ? pulse0LastType : pulse1LastType;
                    for (int i = 0; i < configuredPatternLength; i++)
                    {
                        int patLine = i;

                        int index = i + time;
                        if (index >= _log.Count)
                        {
                            continue;
                        }

                        var rec = _log[index];

                        PulseState pulse = new PulseState();
                        if (track == 0)
                        {
                            pulse = rec.Pulse0;
                        }
                        if (track == 1)
                        {
                            pulse = rec.Pulse1;
                        }

                        // transform quieted notes to dead notes
                        // blech its buggy, im tired
                        ////if (pulse.vol == 0)
                        ////  pulse.en = false;

                        bool keyOff = false, keyOn = false;
                        if (lastNote != -1 && !pulse.En)
                        {
                            lastNote = -1;
                            lastType = -1;
                            keyOff   = true;
                        }
                        else if (lastNote != pulse.Note && pulse.En)
                        {
                            keyOn = true;
                        }

                        if (lastType != pulse.Type && pulse.Note != -1)
                        {
                            keyOn = true;
                        }

                        if (pulse.En)
                        {
                            lastNote = pulse.Note;
                            lastType = pulse.Type;
                        }

                        writer.WriteLine("<Line index=\"{0}\">", patLine);
                        writer.WriteLine("<NoteColumns>");
                        writer.WriteLine("<NoteColumn>");
                        if (keyOn)
                        {
                            writer.WriteLine("<Note>{0}</Note>", NameForNote(pulse.Note));
                            writer.WriteLine("<Instrument>{0:X2}</Instrument>", pulse.Type);
                        }
                        else if (keyOff)
                        {
                            writer.WriteLine("<Note>OFF</Note>");
                        }

                        if (lastNote != -1)
                        {
                            writer.WriteLine("<Volume>{0:X2}</Volume>", pulse.Vol * 8);
                        }

                        writer.WriteLine("</NoteColumn>");
                        writer.WriteLine("</NoteColumns>");
                        writer.WriteLine("</Line>");
                    }

                    // close PatternTrack
                    writer.WriteLine("</Lines>");
                    writer.WriteLine("</PatternTrack>");

                    if (track == 0)
                    {
                        pulse0LastNote = lastNote;
                        pulse0LastType = lastType;
                    }
                    else
                    {
                        pulse1LastNote = lastNote;
                        pulse1LastType = lastType;
                    }
                }                 // pulse tracks loop

                // triangle track generation
                {
                    writer.WriteLine("<PatternTrack type=\"PatternTrack\">");
                    writer.WriteLine("<Lines>");

                    for (int i = 0; i < configuredPatternLength; i++)
                    {
                        int patLine = i;

                        int index = i + time;
                        if (index >= _log.Count)
                        {
                            continue;
                        }

                        var rec = _log[index];

                        TriangleState tri = rec.Triangle;

                        {
                            bool keyOff = false, keyOn = false;
                            if (triLastNote != -1 && !tri.En)
                            {
                                triLastNote = -1;
                                keyOff      = true;
                            }
                            else if (triLastNote != tri.Note && tri.En)
                            {
                                keyOn = true;
                            }

                            if (tri.En)
                            {
                                triLastNote = tri.Note;
                            }

                            writer.WriteLine("<Line index=\"{0}\">", patLine);
                            writer.WriteLine("<NoteColumns>");
                            writer.WriteLine("<NoteColumn>");
                            if (keyOn)
                            {
                                writer.WriteLine("<Note>{0}</Note>", NameForNote(tri.Note));
                                writer.WriteLine("<Instrument>08</Instrument>");
                            }
                            else if (keyOff)
                            {
                                writer.WriteLine("<Note>OFF</Note>");
                            }

                            // no need for tons of these
                            ////if(keyon) writer.WriteLine("<Volume>80</Volume>");

                            writer.WriteLine("</NoteColumn>");
                            writer.WriteLine("</NoteColumns>");
                            writer.WriteLine("</Line>");
                        }
                    }

                    // close PatternTrack
                    writer.WriteLine("</Lines>");
                    writer.WriteLine("</PatternTrack>");
                }

                // noise track generation
                {
                    writer.WriteLine("<PatternTrack type=\"PatternTrack\">");
                    writer.WriteLine("<Lines>");

                    for (int i = 0; i < configuredPatternLength; i++)
                    {
                        int patLine = i;

                        int index = i + time;
                        if (index >= _log.Count)
                        {
                            continue;
                        }

                        var rec = _log[index];

                        NoiseState noise = rec.Noise;

                        // transform quieted notes to dead notes
                        // blech its buggy, im tired
                        ////if (noise.vol == 0)
                        //// noise.en = false;

                        {
                            bool keyOff = false, keyOn = false;
                            if (noiseLastNote != -1 && !noise.En)
                            {
                                noiseLastNote = -1;
                                keyOff        = true;
                            }
                            else if (noiseLastNote != noise.Note && noise.En)
                            {
                                keyOn = true;
                            }

                            if (noise.En)
                            {
                                noiseLastNote = noise.Note;
                            }

                            writer.WriteLine("<Line index=\"{0}\">", patLine);
                            writer.WriteLine("<NoteColumns>");
                            writer.WriteLine("<NoteColumn>");
                            if (keyOn)
                            {
                                writer.WriteLine("<Note>{0}</Note>", NameForNote(noise.Note));
                                writer.WriteLine("<Instrument>04</Instrument>");
                            }
                            else if (keyOff)
                            {
                                writer.WriteLine("<Note>OFF</Note>");
                            }

                            if (noiseLastNote != -1)
                            {
                                writer.WriteLine("<Volume>{0:X2}</Volume>", noise.Vol * 8);
                            }

                            writer.WriteLine("</NoteColumn>");
                            writer.WriteLine("</NoteColumns>");
                            writer.WriteLine("</Line>");
                        }
                    }

                    // close PatternTrack
                    writer.WriteLine("</Lines>");
                    writer.WriteLine("</PatternTrack>");
                }                 // noise track generation

                // write empty track for now for pcm
                for (int track = 4; track < 5; track++)
                {
                    writer.WriteLine("<PatternTrack type=\"PatternTrack\">");
                    writer.WriteLine("<Lines>");
                    writer.WriteLine("</Lines>");
                    writer.WriteLine("</PatternTrack>");
                }

                // we definitely need a dummy master track now
                writer.WriteLine("<PatternMasterTrack type=\"PatternMasterTrack\">");
                writer.WriteLine("</PatternMasterTrack>");

                // close tracks
                writer.WriteLine("</Tracks>");

                // close pattern
                writer.WriteLine("</Pattern>");

                time += configuredPatternLength;
            }             // main pattern loop

            writer.WriteLine("</Patterns>");
            writer.Flush();

            var xNewPatternList = XElement.Parse(writer.ToString());

            xPatternPool.Add(xNewPatternList);

            //write pattern sequence
            writer = new StringWriter();
            writer.WriteLine("<SequenceEntries>");
            for (int i = 0; i < patternCount; i++)
            {
                writer.WriteLine("<SequenceEntry>");
                writer.WriteLine("<IsSectionStart>false</IsSectionStart>");
                writer.WriteLine("<Pattern>{0}</Pattern>", i);
                writer.WriteLine("</SequenceEntry>");
            }
            writer.WriteLine("</SequenceEntries>");

            var xPatternSequence = templateRoot.XPathSelectElement("//PatternSequence");

            xPatternSequence.XPathSelectElement("SequenceEntries").Remove();
            xPatternSequence.Add(XElement.Parse(writer.ToString()));

            //copy template file to target
            File.Delete(outPath);
            File.Copy(templatePath, outPath);

            using var zfOutput = new ZipArchive(new FileStream(outPath, FileMode.Create, FileAccess.Write), ZipArchiveMode.Create);
            using (var stream = zfOutput.CreateEntry("Song.xml").Open())
            {
                templateRoot.Save(stream);
            }
        }
Пример #3
0
        private void btnExport_Click(object sender, EventArgs e)
        {
            //acquire target
            var sfd = new SaveFileDialog();

            sfd.Filter = "XRNS (*.xrns)|*.xrns";
            if (sfd.ShowDialog() != System.Windows.Forms.DialogResult.OK)
            {
                return;
            }

            //configuration:
            var    outPath                 = sfd.FileName;
            string templatePath            = Path.Combine(Path.GetDirectoryName(outPath), "template.xrns");
            int    configuredPatternLength = int.Parse(txtPatternLength.Text);


            //load template
            MemoryStream msSongXml  = new MemoryStream();
            var          zfTemplate = new ICSharpCode.SharpZipLib.Zip.ZipFile(templatePath);
            {
                int zfSongXmlIndex = zfTemplate.FindEntry("Song.xml", true);
                using (var zis = zfTemplate.GetInputStream(zfTemplate.GetEntry("Song.xml")))
                {
                    byte[] buffer = new byte[4096];                         // 4K is optimum
                    ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(zis, msSongXml, buffer);
                }
            }
            XElement templateRoot = XElement.Parse(System.Text.Encoding.UTF8.GetString(msSongXml.ToArray()));

            //get the pattern pool, and whack the child nodes
            var xPatterns    = templateRoot.XPathSelectElement("//Patterns");
            var xPatternPool = xPatterns.Parent;

            xPatterns.Remove();

            var writer = new StringWriter();

            writer.WriteLine("<Patterns>");


            int pulse0_lastNote = -1;
            int pulse0_lastType = -1;
            int pulse1_lastNote = -1;
            int pulse1_lastType = -1;
            int tri_lastNote    = -1;
            int noise_lastNote  = -1;

            int patternCount = 0;
            int time         = 0;

            while (time < Log.Count)
            {
                patternCount++;

                //begin writing pattern: open the tracks list
                writer.WriteLine("<Pattern>");
                writer.WriteLine("<NumberOfLines>{0}</NumberOfLines>", configuredPatternLength);
                writer.WriteLine("<Tracks>");

                //write the pulse tracks
                for (int TRACK = 0; TRACK < 2; TRACK++)
                {
                    writer.WriteLine("<PatternTrack type=\"PatternTrack\">");
                    writer.WriteLine("<Lines>");

                    int lastNote = TRACK == 0 ? pulse0_lastNote : pulse1_lastNote;
                    int lastType = TRACK == 0 ? pulse0_lastType : pulse1_lastType;
                    for (int i = 0; i < configuredPatternLength; i++)
                    {
                        int patLine = i;

                        int index = i + time;
                        if (index >= Log.Count)
                        {
                            continue;
                        }

                        var rec = Log[index];

                        PulseState pulse = new PulseState();
                        if (TRACK == 0)
                        {
                            pulse = rec.pulse0;
                        }
                        if (TRACK == 1)
                        {
                            pulse = rec.pulse1;
                        }

                        //transform quieted notes to dead notes
                        //blech its buggy, im tired
                        //if (pulse.vol == 0)
                        //  pulse.en = false;

                        bool keyoff = false, keyon = false;
                        if (lastNote != -1 && !pulse.en)
                        {
                            lastNote = -1;
                            lastType = -1;
                            keyoff   = true;
                        }
                        else if (lastNote != pulse.note && pulse.en)
                        {
                            keyon = true;
                        }

                        if (lastType != pulse.type && pulse.note != -1)
                        {
                            keyon = true;
                        }

                        if (pulse.en)
                        {
                            lastNote = pulse.note;
                            lastType = pulse.type;
                        }

                        writer.WriteLine("<Line index=\"{0}\">", patLine);
                        writer.WriteLine("<NoteColumns>");
                        writer.WriteLine("<NoteColumn>");
                        if (keyon)
                        {
                            writer.WriteLine("<Note>{0}</Note>", NameForNote(pulse.note));
                            writer.WriteLine("<Instrument>{0:X2}</Instrument>", pulse.type);
                        }
                        else if (keyoff)
                        {
                            writer.WriteLine("<Note>OFF</Note>");
                        }

                        if (lastNote != -1)
                        {
                            writer.WriteLine("<Volume>{0:X2}</Volume>", pulse.vol * 8);
                        }

                        writer.WriteLine("</NoteColumn>");
                        writer.WriteLine("</NoteColumns>");
                        writer.WriteLine("</Line>");
                    }

                    //close PatternTrack
                    writer.WriteLine("</Lines>");
                    writer.WriteLine("</PatternTrack>");

                    if (TRACK == 0)
                    {
                        pulse0_lastNote = lastNote;
                        pulse0_lastType = lastType;
                    }
                    else
                    {
                        pulse1_lastNote = lastNote;
                        pulse1_lastType = lastType;
                    }
                }                 //pulse tracks loop

                //triangle track generation
                {
                    writer.WriteLine("<PatternTrack type=\"PatternTrack\">");
                    writer.WriteLine("<Lines>");

                    for (int i = 0; i < configuredPatternLength; i++)
                    {
                        int patLine = i;

                        int index = i + time;
                        if (index >= Log.Count)
                        {
                            continue;
                        }

                        var rec = Log[index];

                        TriangleState tri = rec.triangle;

                        {
                            bool keyoff = false, keyon = false;
                            if (tri_lastNote != -1 && !tri.en)
                            {
                                tri_lastNote = -1;
                                keyoff       = true;
                            }
                            else if (tri_lastNote != tri.note && tri.en)
                            {
                                keyon = true;
                            }

                            if (tri.en)
                            {
                                tri_lastNote = tri.note;
                            }

                            writer.WriteLine("<Line index=\"{0}\">", patLine);
                            writer.WriteLine("<NoteColumns>");
                            writer.WriteLine("<NoteColumn>");
                            if (keyon)
                            {
                                writer.WriteLine("<Note>{0}</Note>", NameForNote(tri.note));
                                writer.WriteLine("<Instrument>08</Instrument>");
                            }
                            else if (keyoff)
                            {
                                writer.WriteLine("<Note>OFF</Note>");
                            }

                            //no need for tons of these
                            //if(keyon) writer.WriteLine("<Volume>80</Volume>");

                            writer.WriteLine("</NoteColumn>");
                            writer.WriteLine("</NoteColumns>");
                            writer.WriteLine("</Line>");
                        }
                    }

                    //close PatternTrack
                    writer.WriteLine("</Lines>");
                    writer.WriteLine("</PatternTrack>");
                }

                //noise track generation
                {
                    writer.WriteLine("<PatternTrack type=\"PatternTrack\">");
                    writer.WriteLine("<Lines>");

                    for (int i = 0; i < configuredPatternLength; i++)
                    {
                        int patLine = i;

                        int index = i + time;
                        if (index >= Log.Count)
                        {
                            continue;
                        }

                        var rec = Log[index];

                        NoiseState noise = rec.noise;

                        //transform quieted notes to dead notes
                        //blech its buggy, im tired
                        //if (noise.vol == 0)
                        //  noise.en = false;

                        {
                            bool keyoff = false, keyon = false;
                            if (noise_lastNote != -1 && !noise.en)
                            {
                                noise_lastNote = -1;
                                keyoff         = true;
                            }
                            else if (noise_lastNote != noise.note && noise.en)
                            {
                                keyon = true;
                            }

                            if (noise.en)
                            {
                                noise_lastNote = noise.note;
                            }

                            writer.WriteLine("<Line index=\"{0}\">", patLine);
                            writer.WriteLine("<NoteColumns>");
                            writer.WriteLine("<NoteColumn>");
                            if (keyon)
                            {
                                writer.WriteLine("<Note>{0}</Note>", NameForNote(noise.note));
                                writer.WriteLine("<Instrument>04</Instrument>");
                            }
                            else if (keyoff)
                            {
                                writer.WriteLine("<Note>OFF</Note>");
                            }

                            if (noise_lastNote != -1)
                            {
                                writer.WriteLine("<Volume>{0:X2}</Volume>", noise.vol * 8);
                            }

                            writer.WriteLine("</NoteColumn>");
                            writer.WriteLine("</NoteColumns>");
                            writer.WriteLine("</Line>");
                        }
                    }

                    //close PatternTrack
                    writer.WriteLine("</Lines>");
                    writer.WriteLine("</PatternTrack>");
                }                 //noise track generation

                //write empty track for now for pcm
                for (int TRACK = 4; TRACK < 5; TRACK++)
                {
                    writer.WriteLine("<PatternTrack type=\"PatternTrack\">");
                    writer.WriteLine("<Lines>");
                    writer.WriteLine("</Lines>");
                    writer.WriteLine("</PatternTrack>");
                }

                //we definitely need a dummy master track now
                writer.WriteLine("<PatternMasterTrack type=\"PatternMasterTrack\">");
                writer.WriteLine("</PatternMasterTrack>");

                //close tracks
                writer.WriteLine("</Tracks>");

                //close pattern
                writer.WriteLine("</Pattern>");

                time += configuredPatternLength;
            }             //main pattern loop

            writer.WriteLine("</Patterns>");
            writer.Flush();

            var xNewPatternList = XElement.Parse(writer.ToString());

            xPatternPool.Add(xNewPatternList);

            //write pattern sequence
            writer = new StringWriter();
            writer.WriteLine("<SequenceEntries>");
            for (int i = 0; i < patternCount; i++)
            {
                writer.WriteLine("<SequenceEntry>");
                writer.WriteLine("<IsSectionStart>false</IsSectionStart>");
                writer.WriteLine("<Pattern>{0}</Pattern>", i);
                writer.WriteLine("</SequenceEntry>");
            }
            writer.WriteLine("</SequenceEntries>");

            var xPatternSequence = templateRoot.XPathSelectElement("//PatternSequence");

            xPatternSequence.XPathSelectElement("SequenceEntries").Remove();
            xPatternSequence.Add(XElement.Parse(writer.ToString()));

            //copy template file to target
            File.Delete(outPath);
            File.Copy(templatePath, outPath);

            var msOutXml = new MemoryStream();

            templateRoot.Save(msOutXml);
            msOutXml.Flush();
            msOutXml.Position = 0;
            var zfOutput = new ICSharpCode.SharpZipLib.Zip.ZipFile(outPath);

            zfOutput.BeginUpdate();
            zfOutput.Add(new Stupid {
                stream = msOutXml
            }, "Song.xml");
            zfOutput.CommitUpdate();
            zfOutput.Close();

            //for easier debugging, write patterndata XML
            //DUMP_TO_DISK(msOutXml.ToArray())
        }