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; }
private MidiInput(int deviceId) { Items = new NotesCollection(); Project.live.Add(this); midiIn = new MidiIn(deviceId); // default device midiIn.MessageReceived += midiIn_MessageReceived; midiIn.Start(); }
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); }
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); }
public Notes() { Items = new NotesCollection(); Length = Items.CalcLength(); Items.CollectionChanged += NotesChanged; }
public KeyboardInput(Type type) { this.type = type; Items = new NotesCollection(); Project.live.Add(this); }
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); }
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); }