我试图读取一个midi文件,其中只包含一个吉他轨道。这首曲目是由单个音符和和弦组成的。虽然我可以通过onNoteParsed方法成功地读取所有的音符,但我不能读取和弦。实际上,从未调用过onChordParsed方法。
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文件以插入不同类型的和弦,如大调、小调或强力和弦,但这种方法仍未启动。
我是不是漏掉了什么?
发布于 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的看法是:
F 217
我认为一个不是和弦一部分的音符会有isFirstNote() = false,但我需要反复检查。
解析MIDI的和弦
虽然MIDI数据包含每个事件的时间戳,但是从MIDI数据中处理和弦变得非常复杂,超出了我在JFugue中实现的能力。
以下是MIDI的和弦处理困难的一些原因。
如果MIDI是现场演奏的录音,那么时间可能会稍微变差。MIDI中的所有音符可能都不是单个和弦的一部分,或者是两个和弦的一部分,或者一些音符是和弦,而melody.
我意识到有一些音乐记谱工具可以读懂MIDI和解析和弦,但我想这些工具都带有一些关于音乐的假设,并且在它们的发展过程中经历了许多尝试和错误。按照JFugue目前的状态,它只将所有MIDI注释作为注释读取。从MIDI读取的每一个音符都将以isFirstNote()的形式出现,而不知道该音符是和声还是旋律。
https://stackoverflow.com/questions/74358365
复制相似问题