public GFNN1LayerSystem(IIntegrator integrator, double middleFrequency = 440.0, int octaves = 4, int nodesPerOctave = 120, ToneNode soundSource = null)
            : base(integrator)
        {
            // "A dynamical systems approach to musical tonality.". Large 2010. Section 4 "Predicting Tonality".

            // Generate list of natural frequencies. We step
            // linearly through the log-frequency space.

            int numOctaves = octaves;
            int numFrequenciesPerOctave    = nodesPerOctave;
            SortedSet <double> frequencies = new SortedSet <double>();

            double xMiddle            = Math.Log(middleFrequency);
            double numOctavesHalfPow2 = Math.Pow(2.0, numOctaves / 2.0);

            double xLowerBound = Math.Log(middleFrequency / numOctavesHalfPow2);
            double xUpperBound = Math.Log(middleFrequency * numOctavesHalfPow2);

            double xStepSize = (xUpperBound - xLowerBound) / (numOctaves * numFrequenciesPerOctave);


            // Some variables.
            double x;

            // Some methods
            Func <double, double> logFrequencyToFrequency = (lf) => Math.Exp(lf);

            // Add midpoint.
            x = xMiddle;
            frequencies.Add(logFrequencyToFrequency(x));

            // Add lower frequencies.
            while (x >= xLowerBound)
            {
                x -= xStepSize;
                frequencies.Add(logFrequencyToFrequency(x));
            }

            // Add upper frequencies.
            x = xMiddle;
            while (x <= xUpperBound)
            {
                x += xStepSize;
                frequencies.Add(logFrequencyToFrequency(x));
            }

            // Create nodes.

            double alpha;
            double beta;
            double delta;
            double epsilon;
            double omega;

            // Configuration 1
            {
                // "A canonical model for gradient frequency neural networks.
                // Equation 20 test parameters.
                alpha   = 0.0;
                beta    = -10.0;
                delta   = -9.0;
                epsilon = 0.3;
                omega   = 2.0 * Math.PI;
            }

            List <DynamicalNode> nodes = new List <DynamicalNode>();

            foreach (double frequency in frequencies)
            {
                NeuralOscillatorNode node = new NeuralOscillatorNode(
                    0.0,
                    frequency,
                    epsilon,
                    alpha,
                    beta,
                    beta,
                    delta,
                    omega);

                node.Name        = string.Format("ω{0:F3}", frequency);
                node.HistorySize = 2;
                nodes.Add(node);
            }

            // Add audio source node if present.
            if (soundSource != null)
            {
                foreach (var node in nodes)
                {
                    node.AddIncomingNode(soundSource, 1.0, 0.0, 0.0);
                }

                nodes.Add(soundSource);

                this.SoundSource = soundSource;
            }

            // Store nodes.
            this.Nodes = nodes;
        }
Exemplo n.º 2
0
        protected List <NeuralOscillatorNode> GenerateLayer(
            string namePrefix,
            double middleFrequency,
            int numOctaves,
            int numFrequenciesPerOctave,
            double alpha,
            double beta1,
            double beta2,
            double delta,
            double epsilon,
            double omega)
        {
            SortedSet <double> frequencies = new SortedSet <double>();

            double xMiddle            = Math.Log(middleFrequency);
            double numOctavesHalfPow2 = Math.Pow(2.0, numOctaves / 2.0);

            double xLowerBound = Math.Log(middleFrequency / numOctavesHalfPow2);
            double xUpperBound = Math.Log(middleFrequency * numOctavesHalfPow2);

            double xStepSize = (xUpperBound - xLowerBound) / (numOctaves * numFrequenciesPerOctave);


            // Some variables.
            double x;

            // Some methods
            Func <double, double> logFrequencyToFrequency = (lf) => Math.Exp(lf);

            // Add midpoint.
            x = xMiddle;
            frequencies.Add(logFrequencyToFrequency(x));

            // Add lower frequencies.
            while (x >= xLowerBound)
            {
                x -= xStepSize;
                frequencies.Add(logFrequencyToFrequency(x));
            }

            // Add upper frequencies.
            x = xMiddle;
            while (x <= xUpperBound)
            {
                x += xStepSize;
                frequencies.Add(logFrequencyToFrequency(x));
            }

            List <NeuralOscillatorNode> nodes = new List <NeuralOscillatorNode>();

            foreach (double frequency in frequencies)
            {
                NeuralOscillatorNode node = new NeuralOscillatorNode(
                    0.0,
                    frequency,
                    epsilon,
                    alpha,
                    beta1,
                    beta2,
                    delta,
                    omega);

                node.Name        = string.Format("{1}:ω{0:F3}", frequency, namePrefix);
                node.HistorySize = 2;
                nodes.Add(node);
            }

            return(nodes);
        }