Exemplo n.º 1
0
 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;
         }
     }
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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)");
        }