用标准函数库写的mid电脑音乐“编译器”

// 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;

}//main(


//用法和写作的midi文件(源)--资料很多, 可以向我索取……


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值