jkit 发表于 2013-2-3 11:23:27

Java中如何取得midi音乐的最大和弦数

midi音乐的最大和弦数就是最大复音数,所谓复音就是同一时间点(tick)有多种声音,而这时的声音的种数就是复音数,最大复音数就是一首乐曲中复音数最大的那个时间点的复音数。在midi中声音是使用事件(Event)来记录的,事件有发生时间(tick)和该事件的内容(MidiMessage,即声音)两个属性。所以,复音数在midi里面就是同一个tick的事件的个数,最大复音数就是其最大值。java程序如下:
    public long getMaxChordNum(String midi); throws Exception {      File mf = new File(midi);;      Map m = new HashMap();;      Track[] tracks = MidiSystem.getSequence(mf);.getTracks();;      for (int i = 0; i < tracks.length; i++); {            for (int j = 0; j < tracks.size();; j++); {                Long ltick = new Long(tracks.get(j);.getTick(););;                if (ltick.longValue(); == 0L); {                  continue;                }                if (m.containsKey(ltick);); {                  Long value = (Long); m.get(ltick);;                  m.put(ltick, new Long(value.longValue(); + 1););;                } else {                  m.put(ltick, new Long(1););;                }            }      }      Set keys = m.keySet();;      Iterator keyit = keys.iterator();;      long max = 0;      while (keyit.hasNext();); {            Long key = (Long); keyit.next();;            Long value = (Long); m.get(key);;            long tmp = value.longValue();;            if (tmp > max); {                max = tmp;            }      }      return max;    }

效率提高版
    public long getMaxChordNum(Track[] tracks); throws Exception {      long max = 0;      if (tracks != null && tracks.length > 0); {            int size = 0;            for (int i = 0; i < tracks.length; i++); {                size += tracks.size();;            }            long[] ticks = new long;            int idx = 0;            for (int i = 0; i < tracks.length; i++); {                for (int j = 0; j < tracks.size();; j++); {                  ticks = tracks.get(j);.getTick();;                }            }            Arrays.sort(ticks);;            long pretick = 0;            long precnt = 1;            for (int i = 0; i < size; i++); {                if (ticks == 0);                  continue;                if (ticks == pretick); {                  precnt++;                } else {                  max = max < precnt ? precnt : max;                  pretick = ticks;                  precnt = 1;                }            }            max = max < precnt ? precnt : max;      }      return max;    }
页: [1]
查看完整版本: Java中如何取得midi音乐的最大和弦数