Ejemplo n.º 1
0
 public Notes(XmlNode element)
 {
     Items  = new NotesCollection();
     length = float.Parse(element.Attributes["length"].Value, CultureInfo.InvariantCulture);
     offset = float.Parse(element.Attributes["offset"].Value, CultureInfo.InvariantCulture);
     if (element.Attributes["name"] != null)
     {
         Name = element.Attributes["name"].Value;
     }
     if (element.Attributes["title"] != null)
     {
         Title = element.Attributes["title"].Value;
     }
     if (element.Attributes["sound"].Value != "")
     {
         Sound = Project.current[element.Attributes["sound"].Value] as INoteSynth;
     }
     foreach (XmlNode child in element.ChildNodes)
     {
         if ((child as XmlElement)?.Name == "Note")
         {
             Items.Add(new Note(child as XmlElement));
         }
     }
     Items.CollectionChanged += NotesChanged;
 }
Ejemplo n.º 2
0
 private MidiInput(int deviceId)
 {
     Items = new NotesCollection();
     Project.live.Add(this);
     midiIn = new MidiIn(deviceId); // default device
     midiIn.MessageReceived += midiIn_MessageReceived;
     midiIn.Start();
 }
Ejemplo n.º 3
0
        public float[,] GetSound(float start, float length, Rendering rendering, NotesCollection notes)
        {
            long samples          = (long)Project.current.CountSamples(length); //how many samples you need on output
            var  ret              = new float[2, samples];                      //sound that will be returned
            var  notesCount       = notes.Count;
            var  oscillatorsCount = oscillators.Count;

            for (var i = 0; i < notesCount; i++)
            {
                var note             = notes[i].Clone();
                var notSamplesOffset = (long)Project.current.CountSamples(note.Offset - start);
                for (var j = 0; j < oscillatorsCount; j++)
                {
                    if (note.Offset < start + length && note.Offset + note.Length + oscillators[j].R > start)
                    {
                        var j_copy = j;
                        float[,] returnedSound;
                        if (start > note.Offset)
                        {
                            var l1 = note.Length + oscillators[j_copy].R - (start - note.Offset);
                            if (length < l1)
                            {
                                l1 = length;
                            }
                            returnedSound = oscillators[j_copy].GetSound(start - note.Offset, l1, note);
                            for (long k = 0; k < returnedSound.LongLength / 2; k++)
                            {
                                ret[0, k] += returnedSound[0, k];
                                ret[1, k] += returnedSound[1, k];
                            }
                        }
                        else
                        {
                            var l1 = length + start - note.Offset;
                            if (note.Length + oscillators[j_copy].R < l1)
                            {
                                l1 = note.Length + oscillators[j_copy].R;
                            }
                            returnedSound = oscillators[j_copy].GetSound(0, l1, note);
                            var minLength = returnedSound.LongLength / 2;
                            if (ret.LongLength / 2 < minLength)
                            {
                                minLength = ret.LongLength / 2;
                            }
                            long k;
                            for (k = 0; k < minLength; k++)
                            {
                                ret[0, k + notSamplesOffset] += returnedSound[0, k];
                                ret[1, k + notSamplesOffset] += returnedSound[1, k];
                            }
                        }
                    }
                }
            }
            return(ret);
        }
Ejemplo n.º 4
0
        public float[,] GetSound(float start, float length, Rendering rendering, NotesCollection notes)
        {
            long samples    = (long)Project.current.CountSamples(length); //how many samples you need on output
            var  ret        = new float[2, samples];                      //sound that will be returned
            var  notesCount = notes.Count;
            var  tasks      = new Task <float[, ]> [notesCount];

            for (var i = 0; i < notesCount; i++)
            {
                var note = notes[i].Clone();
                var item = findItem(note);
                var currentNoteLength = item.CalcLengthByNote(note);
                if (note.Offset < start + length && note.Offset + currentNoteLength > start)
                {
                    tasks[i] = Task.Run(() =>
                    {
                        try
                        {
                            if (start > note.Offset)
                            {
                                var l1 = currentNoteLength - (start - note.Offset);
                                if (length < l1)
                                {
                                    l1 = length;
                                }
                                return(item.GetSound(start - note.Offset, l1, note));
                            }
                            else
                            {
                                var l1 = length + start - note.Offset;
                                if (note.Length + item.R < l1)
                                {
                                    l1 = currentNoteLength;
                                }
                                return(item.GetSound(0, l1, note));
                            }
                        }
                        catch
                        {
                            return(null);
                        }
                    });
                }
            }

            for (var i = 0; i < notesCount; i++)
            {
                var note = notes[i];
                if (start > note.Offset)
                {
                    if (tasks[i] != null)
                    {
                        try
                        {
                            var retTask = tasks[i].Result;

                            for (long k = 0; k < retTask.LongLength / 2; k++)
                            {
                                ret[0, k] += retTask[0, k];
                                ret[1, k] += retTask[1, k];
                            }
                        }
                        catch (Exception e) { Console.Write(e); }
                    }
                }
                else
                {
                    var notSamplesOffset = (long)Project.current.CountSamples(note.Offset - start);

                    if (tasks[i] != null)
                    {
                        var retTask   = tasks[i].Result;
                        var minLength = retTask.LongLength / 2;
                        if (ret.LongLength / 2 < minLength)
                        {
                            minLength = ret.LongLength / 2;
                        }
                        long k;
                        for (k = 0; k < minLength; k++)
                        {
                            ret[0, k + notSamplesOffset] += retTask[0, k];
                            ret[1, k + notSamplesOffset] += retTask[1, k];
                        }
                    }
                }
            }
            return(ret);
        }
Ejemplo n.º 5
0
 public Notes()
 {
     Items  = new NotesCollection();
     Length = Items.CalcLength();
     Items.CollectionChanged += NotesChanged;
 }
Ejemplo n.º 6
0
 public KeyboardInput(Type type)
 {
     this.type = type;
     Items     = new NotesCollection();
     Project.live.Add(this);
 }
Ejemplo n.º 7
0
        public float[,] GetSound(float start, float length, Rendering rendering, NotesCollection notes)
        {
            var maxLength = notes.Max(note => pitchesToElement[(int)note.Pitch].SoundLength + note.Offset);

            if (length > maxLength)
            {
                length = maxLength;
            }
            long samples    = (long)Project.current.CountSamples(length); //how many samples you need on output
            var  ret        = new float[2, samples];                      //sound that will be returned
            var  notesCount = notes.Count;
            var  tasks      = new Task <float[, ]> [notesCount];

            for (var i = 0; i < notesCount; i++)
            {
                var note = notes[i].Clone();
                if (!pitchesToElement.ContainsKey((int)note.Pitch))
                {
                    continue;
                }
                var BPElement = pitchesToElement[(int)note.Pitch];
                if (note.Offset < start + length && note.Offset + BPElement.SoundLength > start)
                {
                    tasks[i] = Task.Run(() =>
                    {
                        if (start > note.Offset)
                        {
                            var l1 = BPElement.SoundLength - (start - note.Offset);
                            if (length < l1)
                            {
                                l1 = length;
                            }
                            return(pitchesToElement[(int)note.Pitch]?.GetSound(start - note.Offset, l1, note));
                        }
                        else
                        {
                            var l1 = length + start - note.Offset;
                            if (note.Length < l1)
                            {
                                l1 = BPElement.SoundLength;
                            }
                            return(pitchesToElement[(int)note.Pitch]?.GetSound(0, l1, note));
                        }
                    });
                }
            }

            for (var i = 0; i < notesCount; i++)
            {
                var note = notes[i];
                if (start > note.Offset)
                {
                    if (tasks[i] != null)
                    {
                        try
                        {
                            var retTask = tasks[i].Result;
                            if (retTask == null)
                            {
                                continue;
                            }

                            for (long k = 0; k < retTask.LongLength / 2; k++)
                            {
                                ret[0, k] += retTask[0, k];
                                ret[1, k] += retTask[1, k];
                            }
                        }
                        catch (Exception e) { Console.Write(e); }
                    }
                }
                else
                {
                    var notSamplesOffset = (long)Project.current.CountSamples(note.Offset - start);

                    if (tasks[i] != null)
                    {
                        var retTask = tasks[i].Result;
                        if (retTask == null)
                        {
                            continue;
                        }
                        var lengthToCopy = retTask.GetLongLength(1);
                        if (ret.GetLongLength(1) - notSamplesOffset < lengthToCopy)
                        {
                            lengthToCopy = ret.GetLongLength(1) - notSamplesOffset;
                        }
                        for (long k = 0; k < lengthToCopy; k++)
                        {
                            ret[0, k + notSamplesOffset] += retTask[0, k];
                            ret[1, k + notSamplesOffset] += retTask[1, k];
                        }
                    }
                }
            }
            return(ret);
        }
Ejemplo n.º 8
0
        public float[,] GetSound(float start, float length, Rendering rendering, NotesCollection notes)
        {
            if (lastPlayedStart > start)
            {
                endedNotes.Clear();
            }
            lastPlayedStart = start;

            int samples = (int)Project.current.CountSamples(length);//how many samples you need on output

            Note[]       startNotes, endNotes;
            List <float> timeBreaks;

            //lock (notes)
            // {
            //todo dokładna dłuość nuty
            startNotes = notes.Where(note => (note.Offset < start + length && !startedNotes.Contains(note) && !endedNotes.Contains(note))).ToArray();
            endNotes   = notes.Where(note => (note.Offset + note.Length < start + length && !endedNotes.Contains(note))).ToArray();
            startNotes = notes.Where(note => (note.Offset < start + length)).ToArray();
            endNotes   = notes.Where(note => (note.Offset + note.Length < start + length)).ToArray();
            timeBreaks = new List <float> {
                start, start + length
            };

            foreach (var x in startedNotes)
            {
                if (!timeBreaks.Contains(x.Offset))
                {
                    timeBreaks.Add(x.Offset);
                }
            }
            foreach (var x in endNotes)
            {
                if (!timeBreaks.Contains(x.Offset + x.Length))
                {
                    timeBreaks.Add(x.Offset + x.Length);
                }
            }
            //}
            timeBreaks.Sort();
            int sumSamples = 0;

            for (var i = 0; i < timeBreaks.Count - 1; i++)
            {
                writer.Write((int)JmsVstHost.Commands.GetSoundNoteSynth);
                var nowSamples = (int)Project.current.CountSamples(timeBreaks[i + 1] - start);
                if (i == timeBreaks.Count - 2)
                {
                    nowSamples = samples;//to provide errors of float incorrection
                }
                if (nowSamples - sumSamples <= 0)
                {
                    nowSamples = sumSamples + 1;//todo niebezpieczeńswo ze przekroczymy wartość samples
                }
                writer.Write(nowSamples - sumSamples);
                sumSamples = nowSamples;
                //writer.Write(0);
                var startNotes2 = startNotes.Where(note => (note.Offset < timeBreaks[i + 1] && !startedNotes.Contains(note) && !endedNotes.Contains(note))).ToArray();
                var endNotes2   = endNotes.Where(note => (note.Offset + note.Length < timeBreaks[i + 1] && !endedNotes.Contains(note))).ToArray();
                writer.Write((int)startNotes2.Count() + (int)endNotes2.Count());
                foreach (var note in startNotes2)
                {
                    SendNote(note);
                    startedNotes.Add(note);
                }
                foreach (var note in endNotes2)
                {
                    SendEndNote(note);
                    startedNotes.Remove(note);
                    endedNotes.Add(note);
                }
            }


            writer.Flush();
            var ret = new float[2, samples];//sound that will be returned

            var reader = new BinaryReader(process.StandardOutput.BaseStream);

            Debug.WriteLine("startRching " + samples);
            for (var i = 0; i < samples; i++)
            {
                ret[0, i] = reader.ReadSingle();
                ret[1, i] = reader.ReadSingle();
            }
            Debug.WriteLine("endRching " + samples);

            return(ret);
        }