private void setLastNoteOnLength(ArrayList events, EventDJZ off) { for (int i = events.Count - 1; i >= 0; i--) { if (off.channel == ((EventDJZ)events[i]).channel && off.note == ((EventDJZ)events[i]).note) { ((EventDJZ)events[i]).length = off.time - ((EventDJZ)events[i]).time; ((EventDJZ)events[i]).DeltaLength = off.DeltaTime - ((EventDJZ)events[i]).DeltaTime; } } }
private bool haveValue(Hashtable ht, EventDJZ ev, IComparer ic) { IEnumerator ie = ht.Keys.GetEnumerator(); ie.Reset(); while (ie.MoveNext()) { if (ic.Compare(ie.Current, ev) == 0) { return(true); } } return(false); }
public DJZ(Midi mid, int lineCount) { midi = mid; LineCount = lineCount; Clock = 0; Division = (UInt32)midi.header.Division; Tempo = 500000; SetTempo(Tempo); TrackCount = midi.header.Tracks; Events = new ArrayList[TrackCount]; MidiStatus = new byte[TrackCount]; TrackIndex = new int[TrackCount]; CurClock = new UInt32[TrackCount]; CurTime = new double[TrackCount]; PlayNode = new ArrayList(); Controls = new ArrayList(); Lines = new ArrayList(); LastTime = 0; for (int i = 0; i < TrackCount; i++) { Events[i] = new ArrayList(); MidiStatus[i] = 0; TrackIndex[i] = 0; CurClock[i] = 0; CurTime[i] = 0; } Int32 newTempo = -1; Program = new byte[16]; for (int i = 0; i < Program.Length; i++) { Program[i] = 0; } while (true) { bool end = true; for (int t = 0; t < TrackCount; t++) { while (TrackIndex[t] < midi.track[t].dData.Count) { //End of track end = false; int p = 0; byte[] data = (byte[])(midi.track[t].dData[TrackIndex[t]]); Int32[] vlq = Midi.readVLQ(data, p); p += vlq[0]; Int32 deltatime = vlq[1]; //Track timer is zero if (CurClock[t] == deltatime) { TrackIndex[t]++; CurClock[t] = 0; byte state = Midi.readMSB8(data, p); //midi status changed if (state >= 0x80) { MidiStatus[t] = state; p += 1; } else { state = MidiStatus[t]; } //note on/off if (state >= 0x80 && state <= 0x9f) { EventDJZ ev = new EventDJZ(); ev.time = (UInt32)(CurTime[t] / 1000); ev.state = MidiStatus[t]; ev.note = Midi.readMSB8(data, p); p += 1; ev.channel = (byte)(state & 0x0f); ev.program = Program[ev.channel]; ev.pos = (byte)(ev.note % LineCount); ev.track = t; ev.metadata = 0; ev.fullnote = (int)(Clock / (Division * 4)); ev.used = false; ev.selected = false; ev.dragged = false; ev.DeltaTime = (int)Clock; ev.velo = Midi.readMSB8(data, p); p += 1; //Console.WriteLine("Note : " + ev.time + " : " + ev.note + " : " + ev.track); if (ev.velo != 0 && (state >= 0x90 && state <= 0x9f)) { Events[t].Add(ev); } else//note off { setLastNoteOnLength(Events[t], ev); } } //program change if (state >= 0xc0 && state <= 0xcf) { int channel = (byte)(state & 0x0f); int program = Midi.readMSB8(data, p); p += 1; Program[channel] = (byte)program; } //meta if (state == 0xff) { byte meta = Midi.readMSB8(data, p); p += 1; vlq = Midi.readVLQ(data, p); p += vlq[0]; //meta tempo change if (meta == 0x51) { EventDJZ ev = new EventDJZ(); ev.time = (UInt32)(CurTime[t] / 1000); ev.state = MidiStatus[t]; ev.note = EventDJZ.CONTROL_BPM; ev.pos = 0; ev.track = 0; ev.metadata = 0; ev.fullnote = (int)(Clock / (Division * 4)); ev.used = false; ev.selected = false; ev.dragged = false; ev.DeltaTime = (int)Clock; newTempo = (Int32)Midi.readMSB24(data, p); p += 3; SetTempo((UInt32)newTempo);//Tempo changed ! //Console.WriteLine("Tempo Changed : " + newTempo); ev.metadata = (int)BPM; ev.BPM1000 = (int)(60000000000 / newTempo); Controls.Add(ev); } } } else { break; } } CurTime[t] += TickTime; CurClock[t]++; }//track end if (Clock % (Division * 4) == 0) { EventDJZ ev = new EventDJZ(); ev.time = (UInt32)(LastTime / 1000); ev.fullnote = (int)(Clock / (Division * 4)); ev.DeltaTime = (int)Clock; Lines.Add(ev); // Util.println("count = " + ev.metadata); } LastTime += TickTime; Clock++; if (end) { break; } } LastTime /= 1000; Console.WriteLine("LastTime=" + LastTime + "(ms)"); }