gpt4 book ai didi

Java Midi 播放器程序

转载 作者:行者123 更新时间:2023-11-29 08:51:47 24 4
gpt4 key购买 nike

我正在尝试使用以下准则创建一个播放一闪一闪小星星的程序:

a) 试用 Midi 播放器,当您对它的工作方式感到满意时,请执行以下操作:

  1. 创建歌曲类。 i) 创建一个默认构造函数,将歌曲名称设置为“Unknown”。 ii) 创建第二个构造函数,将歌曲名称的字符串作为输入,并将该名称保存在类的实例变量中。
  2. 创建一个 addNote 方法,将音符、速度和持续时间作为输入,并以某种方式将其保存在类中(将音符添加到数组中是一个不错的方法)。
  3. 创建一个 playSong 方法,输出歌曲的名称,然后播放已添加到歌曲中的音符。

例如,下面将创建一首名为“Test”的歌曲,它播放半秒的中间 C 和一秒的 D:

Song test = new Song("Test");
test.addNote(60,127,500);
test.addNote(61,127,1000);
test.playSong();

b) 编写一个使用 Song 类播放 Twinkle Twinkle Little Star 的主要方法,该方法以音符开头:C、C、G、G、A、A、G(二分音符)、F、F、E , E, D, D, C(二分音符)。

我正在尝试弄清楚如何让 playSong 方法播放音符。我假设我需要使用一个循环,其中包含 noteOn、sleep 和 noteOff。

我也不明白我应该在哪里为每个声音添加音符、速度和持续时间。我现在将它们放在我的主要方法中,因为这是我从指南中了解到的,但是我该怎么办呢? ->

public void addNote(int note, int velocity, int duration) {
Info info = new Info(note, velocity, duration);
addNote.add(info); //do I add the notes, velocities, durations here?
//or keep in main?
}

为了完成这个程序我没睡多少觉,所以如果这些是简单的问题,我深表歉意。我做了很多研究(谷歌、书籍等),但我只是没有找到我要找的东西,所以这是我最后的选择。

这是我的更新代码

package song;

import java.util.ArrayList;
import javax.sound.midi.*;

public class Song {

private String name;
private ArrayList<Info> notes;

public Song() {
name = "Unknown";
notes = new ArrayList<Info>();
}

public Song(String nam) {
name = nam;
}

public class Info {

int note;
int velocity;
int duration;

private Info(int note, int velocity, int duration) {
this.note = note;
this.velocity = velocity;
this.duration = duration;
}

}

public String getName(){
return name;
}

public void addNote(int note, int velocity, int duration) {

Info info = new Info(note, velocity, duration);
info.note=note;
info.velocity=velocity;
info.duration=duration;
notes.add(info);

}

public void playSong() {

Synthesizer synth = null;
try {
synth = MidiSystem.getSynthesizer();
} catch (MidiUnavailableException e) {
}
try {
synth.open();
} catch (MidiUnavailableException e) {
e.printStackTrace();

System.exit(1);
}

MidiChannel[] channels = synth.getChannels();

Instrument instruments[] = synth.getAvailableInstruments();
synth.loadInstrument(instruments[0]);
channels[0].programChange(74);

for (Info note : notes){
channels[0].noteOn(note.note, note.velocity);
try {
Thread.sleep(note.duration);
} catch (InterruptedException e) {
}
channels[0].noteOff(note.note);
}
}

public static void main(String[] args) {
Song test= new Song("Twinkle Twinkle Little Star");
test.addNote(60, 127, 500);
test.addNote(60, 127, 500);
test.addNote(67, 127, 500);
test.addNote(67, 127, 500);
test.addNote(69, 127, 500);
test.addNote(69, 127, 500);
test.addNote(67, 127, 1000);
test.addNote(65, 127, 500);
test.addNote(65, 127, 500);
test.addNote(64, 127, 500);
test.addNote(64, 127, 500);
test.addNote(62, 127, 500);
test.addNote(62, 127, 500);
test.addNote(60, 127, 1000);

}
}

这是我的最新动态

package song;


public class Song {

private String name;
private ArrayList<Info> notes;

public Song() {
name = "Unknown";
notes = new ArrayList<Info>();
}

public Song(String nam) {
name = nam;
notes = new ArrayList<Info>();

}

public String getName() {
return name;
}

public class Info {
int note;
int velocity;
int duration;

private Info(int note, int velocity, int duration) {
this.note = note;
this.velocity = velocity;
this.duration = duration;
}
}

public void addNote(int note, int velocity, int duration) {

Info info = new Info(note, velocity, duration);

notes.add(info);

}

public void playSong() {

Synthesizer synth = null;
try {
synth = MidiSystem.getSynthesizer();
} catch (MidiUnavailableException e) {
}
try {
synth.open();
} catch (MidiUnavailableException e) {
e.printStackTrace();

System.exit(1);
}

MidiChannel[] channels = synth.getChannels();

Instrument instruments[] = synth.getAvailableInstruments();
synth.loadInstrument(instruments[0]);
channels[0].programChange(74);

for (Info note : notes) {
channels[0].noteOn(note.note, note.velocity);
try {
Thread.sleep(note.duration);
} catch (InterruptedException e) {
}
channels[0].noteOff(note.note);
}
}

public static void main(String[] args) {
Song test = new Song("Twinkle Twinkle Little Star");
test.addNote(60, 127, 500);
test.addNote(60, 127, 500);
test.addNote(67, 127, 500);
test.addNote(67, 127, 500);
test.addNote(69, 127, 500);
test.addNote(69, 127, 500);
test.addNote(67, 127, 1000);
test.addNote(65, 127, 500);
test.addNote(65, 127, 500);
test.addNote(64, 127, 500);
test.addNote(64, 127, 500);
test.addNote(62, 127, 500);
test.addNote(62, 127, 500);
test.addNote(60, 127, 1000);
test.playSong();

}
}

最佳答案

我建议为您的笔记列表使用不同的名称。不要叫它addNote ,因为你会混淆这和你的 addNote方法。试着叫它 notes .另外,你的 playSong方法不需要这三个参数。

然后你可以在你的 playSong 中写这样的东西方法。

for (Info note : notes) {
channels[0].noteOn(note.note, note.velocity);
try {
Thread.sleep(note.duration);
} catch (InterruptedException e) {
}
channels[0].noteOff(note.note);
}

更新

我注意到您的代码中存在另一个问题。 Info 的构造函数类没有设置属性。所以每次你使用它时,你得到的只是一个空对象。它应该这样说。

private Info(int note, int velocity, int duration) {
this.note = note;
this.velocity = velocity;
this.duration = duration;
}

很抱歉没有早点注意到这一点。让我知道它是否解决了您的问题。

此外,您还需要 notes = new ArrayList<Info>();Song 的两个构造函数中类(class)。而且您不想在 Info 中抛出异常构造函数,因为你将在那时结束你的程序。尝试解决这些问题。如果还是不行,我稍后会尝试更多的东西。

关于Java Midi 播放器程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22467633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com