`
jkit
  • 浏览: 33567 次
  • 性别: Icon_minigender_1
  • 来自: 仙界
社区版块
存档分类

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[i].size();; j++); {
                Long ltick = new Long(tracks[i].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[i].size();;
            }
            long[] ticks = new long[size];
            int idx = 0;
            for (int i = 0; i < tracks.length; i++); {
                for (int j = 0; j < tracks[i].size();; j++); {
                    ticks[idx++] = tracks[i].get(j);.getTick();;
                }
            }
            Arrays.sort(ticks);;
            long pretick = 0;
            long precnt = 1;
            for (int i = 0; i < size; i++); {
                if (ticks[i] == 0);
                    continue;
                if (ticks[i] == pretick); {
                    precnt++;
                } else {
                    max = max < precnt ? precnt : max;
                    pretick = ticks[i];
                    precnt = 1;
                }
            }
            max = max < precnt ? precnt : max;
        }
        return max;
    }
分享到:
评论

相关推荐

    JJazzLab-X:Java中完整的音乐框架,专用于使用Midi自动生成背景音乐

    JJazzLab-X JJazzLab-X是一个基于Midi的框架,专门用于支持曲目的生成-有人谈论“伴奏歌曲”或“自动伴奏应用程序”。 您输入和弦符号,选择一种节奏(风格),然后该应用程序将生成一个完整的伴奏音轨,包括鼓,...

    jfugue-4.0.3.jar

    和其它的音乐API不同,它能够让您用数据字符串来指定音符、乐器、和弦,以及其它音乐数据,而不需要进行底层的MIDI操控。它和其它快速应用程序开发环境类似,只不过是专门用于音乐编程的。在JFugue环境里,音乐编程...

    jfugue-chapter1.pdf

    和其它的音乐API不同,它能够让您用数据字符串来指定音符、乐器、和弦,以及其它音乐数据,而不需要进行底层的MIDI操控。它和其它快速应用程序开发环境类似,只不过是专门用于音乐编程的。在JFugue环境里,音乐编程...

    jfugue:音乐编程的Java API

    以交互方式或算法生成音乐数据,使用音乐模式,节奏,音乐理论的要素(包括和弦和和弦进行),并与外部MIDI设备(例如音乐键盘,混音器等)进行通信。 只需几行代码即可创建音乐! import org.jfugue.player....

    TranscriptingMIDIfile:播放多个MIDI文件

    读取MIDI文件注:此处使用的MIDI文件属于特定家族的和弦,因此,在同时播放时会创建和弦图案。 从JAVA声音库中为每个MIDI文件选择一种乐器。 从文件计算速度汇集多个线程以同时播放它们。 这段代码是项目的一部分,...

    harmonyos2-harmony-analyser:使用WAV或MIDI输入分析和声进程的跨平台Java应用程序

    对于简单的和弦分析,只需下载最新的稳定版本并使用java -jar ha-executable-1.1.jar运行它。 如果您希望运行最新的测试版或进行歌曲分析,则需要进行更全面的设置,因为您的系统上需要存在外部库。 请检查以下先决...

    etude:Java音乐理论库

    练习曲etude是一个专注于音乐基础知识的音乐理论库。 确定性:练习曲涵盖的所有概念均由非随机规则概述。 这意味着练习曲不能分析和弦进行或发展复杂的旋律。 但是,它可以告诉您和弦的音高或旋律音符之间的间隔。 ...

    midi:Midi 库最初是为 javax.sound.midi 不可用的 Google App Engine 环境开发的

    迷笛Midi 库最初是为 javax.sound.midi 不可用的 Google App Engine 环境开发的这个库没有依赖项。 包含 GM MIDI 支持的基本 MIDI 信息。 留言支持频道消息音符开/音符关 (144/128) 控制变更 (176) 计划变更 (192) ...

    TemperamentStudio:Temperament Studio-一个程序,可让您尝试不同的音乐调音方案

    气质工作室Temperament Studio-一个程序,可让您尝试不同的音乐调音方案该存储库包含一个Java应用程序,该应用程序使您可以在乐器上弹奏音符和和弦,并可以根据不同的古代和现代气质进行调音,并且可以更改MIDI文件...

    用matlab生成谐波代码-HarmonicAccompaniment:实时音乐分析和和声伴奏的生成

    然后,“隐马尔可夫模型”使我们能够在一定精度的基础上,根据之前的和弦以及当前正在播放的旋律中的音符来预测连续的和弦。 通过浏览可用状态,然后与状态转换变量进行匹配,就可以确定这种转换。

    MusicTheoryJS:一个简单,轻巧,可扩展的Java音乐理论库

    包括近70个内置音阶和40多个内置和弦 :blue_book: :play_button: 安装 npm: npm i musictheoryjs@latest import * as MT from 'musictheoryjs' ; CDN: ...

    GenMeowth:音乐发生器

    这个简单的程序适合旋律的和弦伴奏。 旋律是在音符图上随机游走生成的,其构成如下: 一组指定的音符(可以选择调和拍号) 从另一个旋律中提取的音符(只能选择拍号) 注意在我们的例子中表示相对持续时间和音高...

    Strummer:使键盘听起来像(弹奏的)吉他

    它通过将音符从键盘和弦更改为吉他和弦,并在它们之间延迟播放它们来模拟连续弹奏的弦之间的时间来实现这一点。 让它工作 加载软件信息处理。 我使用的是 2.2.1 版。 其他 2.x 应该可以工作。 连接您的 Arduino,...

    JPianoTrain-开源

    基于 Java 的疼痛训练器。 根据用户偏好(音阶、单曲/和弦...)创建随机乐谱,并等待正确的 MIDI 输入以擦除正确的音符或抱怨坏音符。 尽管屏幕截图是德语,但它的 i18n 功能简直不堪重负

Global site tag (gtag.js) - Google Analytics