首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用JFugue ParserListenerAdapter onChordParsed方法

未调用JFugue ParserListenerAdapter onChordParsed方法
EN

Stack Overflow用户
提问于 2022-11-08 09:27:44
回答 1查看 50关注 0票数 1

我试图读取一个midi文件,其中只包含一个吉他轨道。这首曲目是由单个音符和和弦组成的。虽然我可以通过onNoteParsed方法成功地读取所有的音符,但我不能读取和弦。实际上,从未调用过onChordParsed方法。

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;
import org.jfugue.parser.ParserListenerAdapter;
import org.jfugue.theory.Chord;
import org.jfugue.theory.Note;

public class MusicStringParserListener extends ParserListenerAdapter {

    private List<String> tokenList = new ArrayList<>();

    @Override
    public void onNoteParsed(Note note) {
        tokenList.add(note.getToneString() + note.getOctave() + note.getDuration());
    }

    @Override
    public void onChordParsed(Chord chord) {
        System.out.println("onChordParsed entered");
    }
    
    public List<String> getTokenList() {
        return tokenList;
    }
}

我试图更改midi文件以插入不同类型的和弦,如大调、小调或强力和弦,但这种方法仍未启动。

我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-09 18:48:13

您说得对,onChordParsed没有被调用--可能应该从API中删除--而onNoteParsed则被使用。

解析断续字符串中的和弦

当JFugue处理和弦时,它会将和弦分解成单独的音符--这对于支持某些音符在本来是和弦的情况下可能在旋律上发生变化是必要的。就JFugue而言,"Cmaj“看起来就像"C+E+G",但是后者提供了更多的分辨率,允许像"Cw+Eh_Ebh+Gw”这样的东西。

不过你还是可以做你想做的事。当你得到一个onNoteParsed事件时,笔记会告诉你它是序列中的第一个音符,一个序列中的下一个音符,还是一个序列中旋律中的另一个音符。

对于传入的每个音符,请使用音符的isFirstNote()isHarmonicNote()isMelodicNote()方法来确定音符是否在和弦中。我相信你对Cw+Eh_Ebh+Gw的看法是:

  • C -第一音符
  • E-调和音符
  • Eb-旋律音符
  • G-调和音符

F 217

我认为一个不是和弦一部分的音符会有isFirstNote() = false,但我需要反复检查。

解析MIDI的和弦

虽然MIDI数据包含每个事件的时间戳,但是从MIDI数据中处理和弦变得非常复杂,超出了我在JFugue中实现的能力。

以下是MIDI的和弦处理困难的一些原因。

如果MIDI是现场演奏的录音,那么时间可能会稍微变差。MIDI中的所有音符可能都不是单个和弦的一部分,或者是两个和弦的一部分,或者一些音符是和弦,而melody.

  • There可能是一个和弦,而arpeggiated.

  • There可能是一个和弦倒转。在MIDI中的

  • ,音符或音符可以出现在MIDI流中的任何地方!通常,他们是在正确的时间顺序,但这不一定是这样的。因此,我们无法确定和弦,直到整个MIDI是同时发生的parsed.

  • Notes,但在不同的频道中不应该是和弦,但这一假设可能并不总是正确的。

我意识到有一些音乐记谱工具可以读懂MIDI和解析和弦,但我想这些工具都带有一些关于音乐的假设,并且在它们的发展过程中经历了许多尝试和错误。按照JFugue目前的状态,它只将所有MIDI注释作为注释读取。从MIDI读取的每一个音符都将以isFirstNote()的形式出现,而不知道该音符是和声还是旋律。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74358365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档