// txt2mid1refact1.cpp : Defines the entry point for the console application.
//用了标准函数库因为它很伟大
#include "stdafx.h"
#include <iostream>
#pragma warning(disable : 4786)
#include<vector>
#include<fstream>
#include<sstream>
//#include<string>
using namespace std;
#define maxMidbuf 1999
struct array{
int i10;
int i16;
int i16f;
string i12s;
string s[5];
string alias;
} ar1[255] ;
//字符串分割函数12
std::vector<std::string> spli2t2(std::string str,std::string pattern ,std::string patter2n)
{
std::string::size_type pos;
std::vector<std::string> result;
str+=pattern;//扩展字符串以方便操作
int size=str.size();
for(int i=0; i<size; i++)
{
std::string::size_type pos1;
std::string::size_type pos2;
pos1=str.find(pattern,i); //两个都比一 遍 ,取小的
pos2=str.find(patter2n,i);
pos=pos2;
if(pos1<pos2) {pos=pos1;} else pos=pos2;
if(pos<size)
{
std::string s=str.substr(i,pos-i);
result.push_back(s);
i=pos+pattern.size()-1;
}
}
return result;
}//字符串分割函数12
//字符串分割函数11
std::vector<std::string> split(std::string str,std::string pattern)
{
std::string::size_type pos;
std::vector<std::string> result;
str+=pattern;//扩展字符串以方便操作
int size=str.size();
for(int i=0; i<size; i++)
{
pos=str.find(pattern,i);
if(pos<size)
{
std::string s=str.substr(i,pos-i);
result.push_back(s);
i=pos+pattern.size()-1;
}
}
return result;
}//字符串分割函数11
//去除字符串(两边的)空格
string trim(string& s)
{
const string drop = " ";
// trim right
s.erase(s.find_last_not_of(drop)+1);
// trim left
return s.erase(0,s.find_first_not_of(drop));
}//vector——string split
int init_array1()
{
for (int i=0;i<5;++i) {//11
for (int j=1;j<=12;++j) {//for22
if (0==i)ar1[12*i+j].i10=i*12+j;
else ar1[48+ 12*i+j].i10=i*12+j;
ar1[j].i16f=i;
if (i>0) {//if23
string str1i1;
char tempc1a[3]="";
itoa( 1+i, tempc1a,10);
str1i1=tempc1a;
switch (j )
{//switch44
case 1: ar1[48+i*12+j].s[1]=str1i1+"do";
break;
case 2: ar1[48+i*12+j].s[1]=str1i1+"do#"; break;
case 3: ar1[48+i*12+j].s[1]=str1i1+"re"; break;
case 4: ar1[48+i*12+j].s[1]=str1i1+"re#"; break;
case 5: ar1[48+i*12+j].s[1]=str1i1+"mi"; break;
case 6: ar1[48+i*12+j].s[1]=str1i1+"fa"; break;
case 7: ar1[48+i*12+j].s[1]=str1i1+"fa#"; break;
case 8: ar1[48+i*12+j].s[1]=str1i1+"so"; break;
case 9: ar1[48+i*12+j].s[1]=str1i1+"so#"; break;
case 10: ar1[48+i*12+j].s[1]=str1i1+"la"; break;
case 11: ar1[48+i*12+j].s[1]=str1i1+"la#"; break;
case 12: ar1[48+i*12+j].s[1]=str1i1+"xi"; break;
}//switch44
}//if23(i>0
else if (0==i){ //if24(0==i
for (int j1=1;j1<=12;++j1) {//for j1 16
ar1[j1].i10=j1;
switch (j1 )
{//switch45
case 1: ar1[j1].s[1]= "do";
break;
case 2: ar1[j1].s[1]= "do#"; break;
case 3: ar1[j1].s[1]= "re"; break;
case 4: ar1[j1].s[1]= "re#"; break;
case 5: ar1[j1].s[1]= "mi"; break;
case 6: ar1[j1].s[1]= "fa"; break;
case 7: ar1[j1].s[1]= "fa#"; break;
case 8: ar1[j1].s[1]= "so"; break;
case 9: ar1[j1].s[1]= "so#"; break;
case 10: ar1[j1].s[1]= "la"; break;
case 11: ar1[j1].s[1]= "la#"; break;
case 12: ar1[j1].s[1]= "xi"; break;
}//switch45
}//for j1 16
}//if24(0==i
}//for22
}//for11
// for (int i2=0;i2>=0;++i) { //for33 //只执行一次
for (int j2=-1;j2>=(-12); --j2) { //for j2 34
//ar1[j2].i10=i2*12-j2;
//int numj=12+(13-j2);
int numj=12;
ar1[12+(-j2)].i10=j2;
//j2=12;
switch(-j2) //switch 只能是正整数
{//switch46
case 1: //int numj=12-j2; cout<<12-j2<<" ";
ar1[ (numj-j2)].s[1]="-xi"; break; //ar1[13]
case 2: ar1[ (numj-j2)].s[1]="-la#"; break;
case 3: ar1[ (numj-j2)].s[1]="-la"; break;
case 4:ar1[ (numj-j2)].s[1]="-so#"; break;
case 5:ar1[ (numj-j2)].s[1]="-so";break;
case 6:ar1[ (numj-j2)].s[1]="-fa#";break;
case 7:ar1[ (numj-j2)].s[1]="-fa";break;
case 8:ar1[ (numj-j2)].s[1]="-mi";break;
case 9:ar1[ (numj-j2)].s[1]="-re#";break;
case 10:ar1[ (numj-j2)].s[1]="-re";break;
case 11:ar1[ (numj-j2)].s[1]="-do#";break;
case 12:ar1[ (numj-j2)].s[1]="-do";break;
default: break;
}//switch46
}//forj2 34
// }//for33
for (int i2=-1;i2>=(-2);i2--) { //for44 //只执行
for (int j2=-1;j2>=(-12); j2=j2-1) { //for j2 34
int numj=12*(-i2)+12 ;
ar1[12+12*(-i2)+(-j2)].i10=j2+(12*i2) ;
//j2=12;
string str1i1;
char tempc1a[3]="";
itoa( (-1+i2), tempc1a,10);
str1i1=tempc1a;
switch(-j2) //switch 只能是正整数
{//switch46
case 1: //int numj=12-j2; cout<<12-j2<<" ";
ar1[ (numj-j2)].s[1]=str1i1+"xi"; break; //ar1[13]
case 2: ar1[ (numj-j2)].s[1]=str1i1+"la#"; break;
case 3: ar1[ (numj-j2)].s[1]=str1i1+"la"; break;
case 4:ar1[ (numj-j2)].s[1]=str1i1+"so#"; break;
case 5:ar1[ (numj-j2)].s[1]=str1i1+"so";break;
case 6:ar1[ (numj-j2)].s[1]=str1i1+"fa#";break;
case 7:ar1[ (numj-j2)].s[1]=str1i1+"fa";break;
case 8:ar1[ (numj-j2)].s[1]=str1i1+"mi";break;
case 9:ar1[ (numj-j2)].s[1]=str1i1+"re#";break;
case 10:ar1[ (numj-j2)].s[1]=str1i1+"re";break;
case 11:ar1[ (numj-j2)].s[1]=str1i1+"do#";break;
case 12:ar1[ (numj-j2)].s[1]=str1i1+"do";break;
default: break;
}//switch46
}//forj2 34
}//for44
/* 十二进制…!
int fuhao=1;
for(int k=0;k<254;++k) { fuhao=?ar1[k].i10>0 1:-1 ;
int ti=abs(ar1[k].i10;
if (ti<13) ar1[k].i12s=fuhao*ti;
else (ti<25) ar1[k].i12s=fuhao*(4+ti);
}//for(int k=0 */
char k1t[9]="";
for( int k1=0;k1<255;++k1) {cout<<"n";
//itoa(k1,k1t,10);
printf("%d",k1);
cout <<" " <<ar1[k1].s[1]<<"="; cout<<ar1[k1].i10<<" | ";}
return 1;
}//ini init_array
int shibieyin1fu( string st1r )
{
int tempi=0;
for (int i=0;i<=256;++i)
{ if (st1r==ar1[i].s[1] ) {tempi=i; goto hasnote;} }
goto notnote;
notnote:
return 256;
hasnote:
return ar1[tempi].i10;
}//int shibieyin1fu
int main(int argc, char* argv[])
{
// ar1[0]={1,0x1,"do"};
init_array1();
unsigned char midBuf[9999]; //maxMidbuf];//一般maxMidbuf=1999
int inumax=0;
// int i=0;
//
std::cout<<"开始转换…Please input str from file:"<<std::endl;
std::string patter1n="//";
ifstream infile("scarborough1fair1.txt", ios::in);//"mi1d1a.txt", ios::in); // "d:\\mi1d1a.txt", ios::in); //"d:\\mi2d1.txt", ios::in);
// 定义打开输出流
ofstream fout("d:\\mid2d2.mid", ios::binary);
ofstream fou2t("d:\\mid2d1.txt", ios::out|ios::trunc);
string currentLine;
//-while11
while(getline(infile,currentLine) ) {
if(NULL== currentLine.size() ) fou2t << endl;//输出到 fou2t!!
if(NULL != currentLine.size() ) { //if22
vector<string> r2=split(currentLine, "//");
string result1Line=""; //初始化本行
int i=0; // i < r2.size()
for(i=0;i<=0;++i) {//for 33
std::cout<<r2[i]<<std::endl;
//vector<string> r3=split( r2[0] , " ");从 逗号分隔 改为 " "
vector<string> r3=spli2t2( r2[0] , " ", "\t");
for(int i3=0;i3<r3.size(); ++i3) {//for44
string st1r1=trim(r3[i3] );
if(0==st1r1.size() ) result1Line+="\t";
if(0!=st1r1.size() ) {//if55
cout<<st1r1<<" ";
char c1t1[5]="";//[19]="";//[7]="";//[6]="";
c1t1[0]='0'; c1t1[1]='x'; //0、1 字节
//此处识别一下 r3[1]是不是音符;
int iValude=0;
int shibieNum=shibieyin1fu( r3[i3]);
if ( shibieNum<255) {
int i1value=59+shibieNum;
iValude=59+shibieNum;
char buffe1r[3]=" ";
sprintf(buffe1r,"%.2x",i1value);
result1Line= result1Line+"0x"+ buffe1r+" ";
}//if ( shibieNum<255)
else {//if 66
//
char * c1p1=&c1t1[2];
strcpy(c1p1, st1r1.c_str() );// 拷贝给 2、3 字节
c1t1[4]='\0';
printf("s=%s", c1t1);
result1Line= result1Line+ c1t1+" "; //本行恢复为另一文件(16进制的)以方便回复到(别的)程序去,用来调试…
sscanf( c1t1, "%x", &iValude); //按16进制(的字符串)转换为 数值给iValude
}//if66
midBuf[inumax]=(char)iValude; //又(取)低位字节)转化为字节
++inumax;
}//if55
}//for44
}//for33
//-再把每行的 字符串 (加16进制前缀等)再串起来
for (i=1;i<r2.size(); ++i)
{//34
result1Line=result1Line+ "//"+ r2[i];
}//34
//输出到 fou2t!!
fou2t<<result1Line<<endl;
//=再把每行的 字符串 (加16进制前缀等)再串起来=
}//if22
}//while(getline(infile,currentLine)
//=while11=
midBuf[inumax]='\0';//把缓冲区给结束符号
cout<<"mid3缓冲区长度="<<sizeof(midBuf)<<endl;
cout<<"inuMax"<<inumax<<endl;
int iValud2=inumax-22;
int iValud12=0;
if (iValud2>255) { iValud12= iValud2/256; iValud2=iValud2-(256*iValud12);}
cout<<"inumax-22="<<inumax-22<<endl;
printf("十六进制是:%x\n",inumax-22);
midBuf[20]=(unsigned char)iValud12;
midBuf[21]=(unsigned char)iValud2; //这是算出音轨的 长度 ,矫正后 写进缓冲区 和文件
fout.write( (char *)(&midBuf), inumax) ; // sizeof(mid3))是整个缓冲区的长度,要用(用过的)占用的长度;
// 关闭输出流
fou2t.close();
fout.close();
//
printf("Hello World!\n");
// init_array1();
return 0;
//用了标准函数库因为它很伟大
#include "stdafx.h"
#include <iostream>
#pragma warning(disable : 4786)
#include<vector>
#include<fstream>
#include<sstream>
//#include<string>
using namespace std;
#define maxMidbuf 1999
struct array{
int i10;
int i16;
int i16f;
string i12s;
string s[5];
string alias;
} ar1[255] ;
//字符串分割函数12
std::vector<std::string> spli2t2(std::string str,std::string pattern ,std::string patter2n)
{
std::string::size_type pos;
std::vector<std::string> result;
str+=pattern;//扩展字符串以方便操作
int size=str.size();
for(int i=0; i<size; i++)
{
std::string::size_type pos1;
std::string::size_type pos2;
pos1=str.find(pattern,i); //两个都比一 遍 ,取小的
pos2=str.find(patter2n,i);
pos=pos2;
if(pos1<pos2) {pos=pos1;} else pos=pos2;
if(pos<size)
{
std::string s=str.substr(i,pos-i);
result.push_back(s);
i=pos+pattern.size()-1;
}
}
return result;
}//字符串分割函数12
//字符串分割函数11
std::vector<std::string> split(std::string str,std::string pattern)
{
std::string::size_type pos;
std::vector<std::string> result;
str+=pattern;//扩展字符串以方便操作
int size=str.size();
for(int i=0; i<size; i++)
{
pos=str.find(pattern,i);
if(pos<size)
{
std::string s=str.substr(i,pos-i);
result.push_back(s);
i=pos+pattern.size()-1;
}
}
return result;
}//字符串分割函数11
//去除字符串(两边的)空格
string trim(string& s)
{
const string drop = " ";
// trim right
s.erase(s.find_last_not_of(drop)+1);
// trim left
return s.erase(0,s.find_first_not_of(drop));
}//vector——string split
int init_array1()
{
for (int i=0;i<5;++i) {//11
for (int j=1;j<=12;++j) {//for22
if (0==i)ar1[12*i+j].i10=i*12+j;
else ar1[48+ 12*i+j].i10=i*12+j;
ar1[j].i16f=i;
if (i>0) {//if23
string str1i1;
char tempc1a[3]="";
itoa( 1+i, tempc1a,10);
str1i1=tempc1a;
switch (j )
{//switch44
case 1: ar1[48+i*12+j].s[1]=str1i1+"do";
break;
case 2: ar1[48+i*12+j].s[1]=str1i1+"do#"; break;
case 3: ar1[48+i*12+j].s[1]=str1i1+"re"; break;
case 4: ar1[48+i*12+j].s[1]=str1i1+"re#"; break;
case 5: ar1[48+i*12+j].s[1]=str1i1+"mi"; break;
case 6: ar1[48+i*12+j].s[1]=str1i1+"fa"; break;
case 7: ar1[48+i*12+j].s[1]=str1i1+"fa#"; break;
case 8: ar1[48+i*12+j].s[1]=str1i1+"so"; break;
case 9: ar1[48+i*12+j].s[1]=str1i1+"so#"; break;
case 10: ar1[48+i*12+j].s[1]=str1i1+"la"; break;
case 11: ar1[48+i*12+j].s[1]=str1i1+"la#"; break;
case 12: ar1[48+i*12+j].s[1]=str1i1+"xi"; break;
}//switch44
}//if23(i>0
else if (0==i){ //if24(0==i
for (int j1=1;j1<=12;++j1) {//for j1 16
ar1[j1].i10=j1;
switch (j1 )
{//switch45
case 1: ar1[j1].s[1]= "do";
break;
case 2: ar1[j1].s[1]= "do#"; break;
case 3: ar1[j1].s[1]= "re"; break;
case 4: ar1[j1].s[1]= "re#"; break;
case 5: ar1[j1].s[1]= "mi"; break;
case 6: ar1[j1].s[1]= "fa"; break;
case 7: ar1[j1].s[1]= "fa#"; break;
case 8: ar1[j1].s[1]= "so"; break;
case 9: ar1[j1].s[1]= "so#"; break;
case 10: ar1[j1].s[1]= "la"; break;
case 11: ar1[j1].s[1]= "la#"; break;
case 12: ar1[j1].s[1]= "xi"; break;
}//switch45
}//for j1 16
}//if24(0==i
}//for22
}//for11
// for (int i2=0;i2>=0;++i) { //for33 //只执行一次
for (int j2=-1;j2>=(-12); --j2) { //for j2 34
//ar1[j2].i10=i2*12-j2;
//int numj=12+(13-j2);
int numj=12;
ar1[12+(-j2)].i10=j2;
//j2=12;
switch(-j2) //switch 只能是正整数
{//switch46
case 1: //int numj=12-j2; cout<<12-j2<<" ";
ar1[ (numj-j2)].s[1]="-xi"; break; //ar1[13]
case 2: ar1[ (numj-j2)].s[1]="-la#"; break;
case 3: ar1[ (numj-j2)].s[1]="-la"; break;
case 4:ar1[ (numj-j2)].s[1]="-so#"; break;
case 5:ar1[ (numj-j2)].s[1]="-so";break;
case 6:ar1[ (numj-j2)].s[1]="-fa#";break;
case 7:ar1[ (numj-j2)].s[1]="-fa";break;
case 8:ar1[ (numj-j2)].s[1]="-mi";break;
case 9:ar1[ (numj-j2)].s[1]="-re#";break;
case 10:ar1[ (numj-j2)].s[1]="-re";break;
case 11:ar1[ (numj-j2)].s[1]="-do#";break;
case 12:ar1[ (numj-j2)].s[1]="-do";break;
default: break;
}//switch46
}//forj2 34
// }//for33
for (int i2=-1;i2>=(-2);i2--) { //for44 //只执行
for (int j2=-1;j2>=(-12); j2=j2-1) { //for j2 34
int numj=12*(-i2)+12 ;
ar1[12+12*(-i2)+(-j2)].i10=j2+(12*i2) ;
//j2=12;
string str1i1;
char tempc1a[3]="";
itoa( (-1+i2), tempc1a,10);
str1i1=tempc1a;
switch(-j2) //switch 只能是正整数
{//switch46
case 1: //int numj=12-j2; cout<<12-j2<<" ";
ar1[ (numj-j2)].s[1]=str1i1+"xi"; break; //ar1[13]
case 2: ar1[ (numj-j2)].s[1]=str1i1+"la#"; break;
case 3: ar1[ (numj-j2)].s[1]=str1i1+"la"; break;
case 4:ar1[ (numj-j2)].s[1]=str1i1+"so#"; break;
case 5:ar1[ (numj-j2)].s[1]=str1i1+"so";break;
case 6:ar1[ (numj-j2)].s[1]=str1i1+"fa#";break;
case 7:ar1[ (numj-j2)].s[1]=str1i1+"fa";break;
case 8:ar1[ (numj-j2)].s[1]=str1i1+"mi";break;
case 9:ar1[ (numj-j2)].s[1]=str1i1+"re#";break;
case 10:ar1[ (numj-j2)].s[1]=str1i1+"re";break;
case 11:ar1[ (numj-j2)].s[1]=str1i1+"do#";break;
case 12:ar1[ (numj-j2)].s[1]=str1i1+"do";break;
default: break;
}//switch46
}//forj2 34
}//for44
/* 十二进制…!
int fuhao=1;
for(int k=0;k<254;++k) { fuhao=?ar1[k].i10>0 1:-1 ;
int ti=abs(ar1[k].i10;
if (ti<13) ar1[k].i12s=fuhao*ti;
else (ti<25) ar1[k].i12s=fuhao*(4+ti);
}//for(int k=0 */
char k1t[9]="";
for( int k1=0;k1<255;++k1) {cout<<"n";
//itoa(k1,k1t,10);
printf("%d",k1);
cout <<" " <<ar1[k1].s[1]<<"="; cout<<ar1[k1].i10<<" | ";}
return 1;
}//ini init_array
int shibieyin1fu( string st1r )
{
int tempi=0;
for (int i=0;i<=256;++i)
{ if (st1r==ar1[i].s[1] ) {tempi=i; goto hasnote;} }
goto notnote;
notnote:
return 256;
hasnote:
return ar1[tempi].i10;
}//int shibieyin1fu
int main(int argc, char* argv[])
{
// ar1[0]={1,0x1,"do"};
init_array1();
unsigned char midBuf[9999]; //maxMidbuf];//一般maxMidbuf=1999
int inumax=0;
// int i=0;
//
std::cout<<"开始转换…Please input str from file:"<<std::endl;
std::string patter1n="//";
ifstream infile("scarborough1fair1.txt", ios::in);//"mi1d1a.txt", ios::in); // "d:\\mi1d1a.txt", ios::in); //"d:\\mi2d1.txt", ios::in);
// 定义打开输出流
ofstream fout("d:\\mid2d2.mid", ios::binary);
ofstream fou2t("d:\\mid2d1.txt", ios::out|ios::trunc);
string currentLine;
//-while11
while(getline(infile,currentLine) ) {
if(NULL== currentLine.size() ) fou2t << endl;//输出到 fou2t!!
if(NULL != currentLine.size() ) { //if22
vector<string> r2=split(currentLine, "//");
string result1Line=""; //初始化本行
int i=0; // i < r2.size()
for(i=0;i<=0;++i) {//for 33
std::cout<<r2[i]<<std::endl;
//vector<string> r3=split( r2[0] , " ");从 逗号分隔 改为 " "
vector<string> r3=spli2t2( r2[0] , " ", "\t");
for(int i3=0;i3<r3.size(); ++i3) {//for44
string st1r1=trim(r3[i3] );
if(0==st1r1.size() ) result1Line+="\t";
if(0!=st1r1.size() ) {//if55
cout<<st1r1<<" ";
char c1t1[5]="";//[19]="";//[7]="";//[6]="";
c1t1[0]='0'; c1t1[1]='x'; //0、1 字节
//此处识别一下 r3[1]是不是音符;
int iValude=0;
int shibieNum=shibieyin1fu( r3[i3]);
if ( shibieNum<255) {
int i1value=59+shibieNum;
iValude=59+shibieNum;
char buffe1r[3]=" ";
sprintf(buffe1r,"%.2x",i1value);
result1Line= result1Line+"0x"+ buffe1r+" ";
}//if ( shibieNum<255)
else {//if 66
//
char * c1p1=&c1t1[2];
strcpy(c1p1, st1r1.c_str() );// 拷贝给 2、3 字节
c1t1[4]='\0';
printf("s=%s", c1t1);
result1Line= result1Line+ c1t1+" "; //本行恢复为另一文件(16进制的)以方便回复到(别的)程序去,用来调试…
sscanf( c1t1, "%x", &iValude); //按16进制(的字符串)转换为 数值给iValude
}//if66
midBuf[inumax]=(char)iValude; //又(取)低位字节)转化为字节
++inumax;
}//if55
}//for44
}//for33
//-再把每行的 字符串 (加16进制前缀等)再串起来
for (i=1;i<r2.size(); ++i)
{//34
result1Line=result1Line+ "//"+ r2[i];
}//34
//输出到 fou2t!!
fou2t<<result1Line<<endl;
//=再把每行的 字符串 (加16进制前缀等)再串起来=
}//if22
}//while(getline(infile,currentLine)
//=while11=
midBuf[inumax]='\0';//把缓冲区给结束符号
cout<<"mid3缓冲区长度="<<sizeof(midBuf)<<endl;
cout<<"inuMax"<<inumax<<endl;
int iValud2=inumax-22;
int iValud12=0;
if (iValud2>255) { iValud12= iValud2/256; iValud2=iValud2-(256*iValud12);}
cout<<"inumax-22="<<inumax-22<<endl;
printf("十六进制是:%x\n",inumax-22);
midBuf[20]=(unsigned char)iValud12;
midBuf[21]=(unsigned char)iValud2; //这是算出音轨的 长度 ,矫正后 写进缓冲区 和文件
fout.write( (char *)(&midBuf), inumax) ; // sizeof(mid3))是整个缓冲区的长度,要用(用过的)占用的长度;
// 关闭输出流
fou2t.close();
fout.close();
//
printf("Hello World!\n");
// init_array1();
return 0;
}//main(
//用法和写作的midi文件(源)--资料很多, 可以向我索取……