我想写一个C++程序,使用switch语句将MIDI音符号转换为名称和八度音。
我在我的代码中出现了一些错误,代码应该打印出音符名称和八度数(例如:输入-> 24
; 输出 -> C1
).
https:/www.inspiredacoustics.comenMIDI_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语句中加入什么?
首先是一些提示。
"我想写一个C++脚本"
术语 脚本 通常用于解释型语言,比如shell脚本。由于c++是一种编译语言,我们不把它们命名为 脚本. 这是一个c++程序或c++源码。
"我应该在switch语句中加入什么。"
你不用任何switch语句! 你从一个字符串中挑选一些子串。这和switch语句没有任何关系!
你的代码有什么问题。
你选择子字符串的计算方法很好, 但你假设你的字符串中的音符总是有2个长度, 但你用2个字符来表示 "C "或3个字符来表示 "A#". 你应该简单地把每个音符用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;
}
我觉得你最好用一个char数组的表来存储笔记。我建议使用下面的代码。
#include <iostream>
#include <string>
const char notes[12][4]={"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
void midiToNote(int midi, int& octave,std::string& note)
{
octave = ( (midi-12)/12 );
note = std::string(notes[midi%12]);
}
int main()
{
int midi;
int oct;
std::string name;
midi = 29;
midiToNote(midi,oct,name);
std::cout << midi <<" is " <<name << oct<< std::endl;
midi = 51;
midiToNote(midi,oct,name);
std::cout << midi <<" is "<< name << oct << std::endl;
return 0;
}
希望对你有所帮助。