gpt4 book ai didi

c++ - 编写程序以帮助Tudio将Midi音符编号转换为名称和 Octave

转载 作者:行者123 更新时间:2023-12-01 14:42:39 24 4
gpt4 key购买 nike

我想编写一个使用switch语句将MIDI音符编号转换为名称和 Octave 的C++程序吗?

我的代码中有一些错误,该代码应打印出一个音符名称和 Octave 数(例如,输入-> 24;输出-> C1)。

https://www.inspiredacoustics.com/en/MIDI_note_numbers_and_center_frequencies

int main() {
int mi;
cout <<"MIDI value: " << std::endl;
cin >> mi;

int oct_v;
oct_v = (mi/12) - 1;

string notes;
notes = "C C# D D# E F F# G G# A A# B";

string nt;
nt = notes.substr((mi % 12) * 2 , (mi % 12) * 2 +2);

cout <<"Note name " << nt << oct_v;

return 0;
}

代码并不完美,我对应该在switch语句中放入什么表示怀疑。

最佳答案

首先有一些提示:

"I want to write a C++ script"



术语脚本通常用于解释性语言,例如 shell 程序脚本。由于c++是一种编译语言,因此我们不将其命名为脚本。它是c++程序或c++源代码。

" what should I put into switch statements."



您不使用任何switch语句!您从字符串中选择一些子字符串。这与switch语句无关!

您的代码有什么问题:

您选择子字符串的计算非常好,但是您假设字符串中的音符的长度始终为2,但是使用2个字符表示。 “C”或“A#”的3个字符。您只需将字符串写成每个音符包含2个字母,如下所示:
std::string notes = "C C#D D#E F F#G G#A A#B";
substr的第二个参数是长度而不是结束位置。

另外:您不应该使用 using namespace std;
这也是一些带有switch语句的替代解决方案。
int main() {
int mi;
std::cout <<"MIDI value: " << std::endl;
std::cin >> mi;

unsigned int oct_v = mi/12 -1;

// variant with array
std::string notes[]={"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
std::string nt = notes[mi%12];

// variant with substring ( from your code, but fixed )
std::string notes2= "C C#D D#E F F#G G#A A#B";
std::string nt2 = notes2.substr((mi % 12) * 2 , 2);

std::string nt3;

// with switch
switch ( mi%12 )
{
case 0: nt3 = "C"; break;
case 1: nt3 = "C#"; break;
case 2: nt3 = "D"; break;
case 3: nt3 = "D#"; break;
case 4: nt3 = "E"; break;
case 5: nt3 = "F"; break;
case 6: nt3 = "F#"; break;
case 7: nt3 = "G"; break;
case 8: nt3 = "G#"; break;
case 9: nt3 = "A"; break;
case 10: nt3 = "A#"; break;
case 11: nt3 = "B"; break;
}


std::cout <<"Note name " << nt << ":" << oct_v << std::endl;
std::cout <<"Note name2 " << nt2 << ":" << oct_v << std::endl;
std::cout <<"Note name3 " << nt3 << ":" << oct_v << std::endl;

return 0;
}

关于c++ - 编写程序以帮助Tudio将Midi音符编号转换为名称和 Octave ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62364968/

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