`
jkit
  • 浏览: 34090 次
  • 性别: 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;
    }
分享到:
评论

相关推荐

    java有关音乐的程序

    在Java编程语言中,开发与音乐相关的程序是一个有趣且实用的应用领域。这个程序可能是为了播放、处理或管理音频文件,适合初学者学习基础的Java I/O流、多线程和事件处理等概念。下面我们将详细探讨Java在音乐编程中...

    风沙:从Java源质量指标生成MIDI音乐

    "风沙:从Java源质量指标生成MIDI音乐"是一个独特的项目,它将软件工程中的代码质量检查与艺术创作相结合,通过分析Java源代码的质量指标,转换成可听的MIDI音乐。这个项目的创新之处在于它为程序员提供了一种全新的...

    JAMMING WITH JAVA™ TECHNOLOGY: MAKING MUSIC WITH JFUGUE AND JFRETS

    JFugue是一个开源的Java API,它为编程音乐提供了一个简单而直接的途径,使得开发者可以在Java应用程序中直接创造音乐,而无需直接处理复杂的MIDI消息。它背后的原理是在后台自动生成MIDI消息,但允许用户以一种自然...

    java模拟钢琴

    通过Java的javax.sound.midi包,开发者可以生成MIDI消息,实现精确的音符控制和音乐序列播放。 7. **音乐理论**:了解基本的音乐理论,如音阶、调性、节奏等,可以帮助开发者更好地实现钢琴的音乐功能,例如自动...

    JAVA--piano.zip_c#钢琴_java 钢琴_piano_piano-java

    在本项目中,我们关注的是一个使用JAVA编程语言编写的钢琴程序。这个程序可能是为了模拟真实的钢琴演奏体验,让用户可以通过软件界面或者特定的输入设备(如键盘)来弹奏音符,创作音乐。"JAVA--piano.zip_c#钢琴_...

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

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

    jfugue-4.0.3.jar

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

    JChordFramework

    "JChord"顾名思义,是Java语言实现的和弦处理模块,它涵盖了各种音乐理论中的和弦类型,包括大调、小调、增减和弦、七和弦等。框架的设计理念是使开发者能够通过简单的API调用来创建、识别和操作音乐中的和弦,极大...

    基于java的五线谱处理类库 abc4j.zip

    6. **音乐理论支持**:由于ABC4J是面向音乐处理的,所以它内置了音乐理论的支持,比如调性转换、音阶计算、和弦构造等。这使得开发者可以处理更复杂的音乐结构和变化。 7. **可扩展性**:ABC4J的设计允许开发者通过...

    和弦查找器

    2. **音符与频率计算**:应用可能包含了计算音符频率的算法,以便准确地表示和弦中的每个音符。这涉及到音乐理论中的音高、调性和音阶。 3. **和弦数据库**:为了查找和弦,应用可能有一个内置的和弦数据库,包含...

    musicBalaBala

    2. **MIDI(Musical Instrument Digital Interface)支持**:Java Sound API也提供了对MIDI的支持,可以创建、编辑和播放MIDI序列。"musicBalaBala"或许能利用此功能实现音乐创作,如虚拟乐器演奏、音乐合成。 3. *...

    jfugue_programming.pdf

    标题《jfugue_programming.pdf》提示本文档可能是关于Java编程中用于音乐编程的一个库JFugue的介绍和使用方法。从描述和部分内容中,我们可以提炼出以下知识点: JFugue是一个开源的音乐编程API,主要用途是在Java...

    jfugue的使用

    jfugue是一种Java库,主要用于在Java环境中编辑和操作MIDI文件以及保存为MIDI格式。jfugue的核心功能是Music String(音乐字符串),它是一种特殊格式的字符串对象,用于包含音乐指令。通过编写Music String,开发者...

    使用jfugue来演奏mid音乐

    JFugue是一个Java库,专门用于音乐编程。它允许开发者使用文本字符串来表示音乐,然后将这些字符串解析成 MIDI(Musical Instrument Digital Interface)信号,进而让计算机播放音乐。这个库非常适合那些想要通过...

    非常之经典的钢琴模拟程序

    【标题】"非常之经典的钢琴模拟程序...总的来说,这个"非常之经典的钢琴模拟程序"不仅是一个娱乐工具,也是学习Java编程和音乐理论的好教材,它体现了软件工程中的创新和实用性,为用户提供了一种全新的数字音乐体验。

    jfugue:音乐编程的Java API

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

    TranscriptingMIDIfile:播放多个MIDI文件

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

    midigenderswap:交换Midi文件的次要和主要密钥

    Java是一种广泛使用的面向对象的编程语言,具有跨平台的特性,可以在各种操作系统上运行,这使得midigenderswap能够在各种环境下的音乐制作流程中发挥作用。 **文件结构推测:** 压缩包文件“midigenderswap-...

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

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

Global site tag (gtag.js) - Google Analytics