[生存志] 第59节 仲尼弟子座次


        仲尼弟子座次


        公元前525年孔子26岁时,郯国首任国君“郯子”来到鲁国拜见“鲁昭公”。郯国是一个位于山东临沂郯县的小国,而“郯子”是有史以来唯一的“民选国君”。“郯子”出生于普通农民家庭,凭借“鹿乳奉亲”的孝行成功跻身《二十四孝图》第五图。由于“郯子”贤孝之名远播,人们纷纷慕名来到他的家乡,拜他为师,向他学习知识以及做人的道理。有人为了求学方便,就和他“比邻而居”。渐渐的人越聚越多,郯子的家乡就由乡村变成了城镇.又由城镇变成了邦国。邦国“郯国”成立后,人们一致推举郯子做了第一任国君。郯子治理“郯国”时讲道德、施仁义,恩威有加,郯地文化发达,民风淳厚,百姓心悦诚服。孔子少年时也曾经在“郯国”住过一段时日,接受过郯子的教诲,这一次就趁着郯子访鲁的机会向他询问了有关古代官制中诸如“以鸟名官”之类的学问,从而留传下“孔子师郯子”的故事。


        公元前523年孔子28岁时,在鲁国“三桓”孟氏家的公子“南宫敬叔”的陪同下,“一车二马一童一御”前往洛阳向时年48岁的“老聃”请教学问。临别时,老聃赠言说:『富贵者送人以财,仁义者送人以言。吾不富不贵,无财以送汝;愿以数言相送。当今之世,聪明而深察者,其所以遇难而几至于死,在于好讥人之非也;善辩而通达者,其所以招祸而屡至于身,在于好扬人之恶也。为人之子,勿以己为高;为人之臣,勿以己为上,望汝切记』,老聃看出孔子品行高洁,抵触“和光同尘”,性情坚毅,偏好“宁折不弯”,怕他聪明早夭,就告诫他不要“讥人非,扬人恶”,要“上善若水,善下于人”。孔子在黄河边发出『逝者如斯夫,不舍昼夜!』的慨叹,老聃明示他『人生天地之间,乃与天地一体也。天地,自然之物也;人生,亦自然之物;人有幼、少、壮、老之变化,犹如天地有春、夏、秋、冬之交替。生于自然,死于自然,任其自然,则本性不乱;不任自然,奔忙于仁义之间,则本性羁绊。功名存于心,则焦虑之情生;利欲留于心,则烦恼之情增』。


        老聃欣赏孔子“好学上进,人才难得”,点化孔子不遗余力。孔子悟性一般,心眷红尘,难以领会“道门真义”。孔子说,『吾乃忧大道不行,仁义不施,战乱不止,国乱不治也,故有人生短暂,不能有功于世、不能有为于民之感叹矣』。孔子怀揣“行大道,施仁义,止战乱,治乱国”的赤子情怀回到鲁国,从此开放私学,广收门徒,传授六艺,兴盛士林,终成一代名儒,万世师表。


        公元前522年,29岁的孔子开始教学生涯,此时年龄达到12周岁,够格当他弟子的至少有“南宫敬叔”,“孟懿子”,“颜路”,“曾点”,“子路”,“冉耕”,“秦子丕”,“任不齐”,“荣子祈”,“燕伋”,“闵子骞”等人。比如对于公元前518年孟懿子和南宫敬叔学礼于孔子一事,就有明确记录。


        公元前517年孔子34岁时,鲁国发生内乱,鲁昭公被迫逃往齐国。孔子也离开鲁国,到了齐国,受到齐景公赏识和厚待。时年33岁的齐景公曾准备把尼溪一带的田地封给孔子,但被时年61岁的齐国大夫晏婴阻止。公元前507年,孔子45岁,此时年龄够格当他弟子的至少有增添“冉雍”,“冉求”,“宰予”,“颜回”,“有若”,“高子羔”,“子贡”,“宓不齐”。


        公元前504年,季氏家臣“阳虎”擅权日重,孔子称之为“家臣掌政”。他退隐修著《诗》、《书》、《礼》、《乐》,带领众多弟子走学各国。阳虎想要见孔子,并劝孔子出仕,孔子没有明确表态,阳虎不久后任命孔子为“小司空”。公元前499年,52岁的孔子升任鲁国“大司寇”,『摄相事,七日而诛少正卯,曝尸三日,鲁国大治』。此时年龄够格当他弟子的至少有增添“原宪”,“石作蜀”,“公西赤”。


        公元前497年,54岁的孔子与“三桓”闹掰,鲁国待不下去了,开始“周游列国”。公元前492年,孔子59岁,此时年龄够格当他弟子的至少有增添“澹台灭明”,“樊须”,“曾参”,“言偃”,“卜商”。公元前489年,62岁的孔子跟弟子在陈国和蔡国之间被困绝粮,许多弟子因为困饿而生了病。后来被楚国人相救。由楚国返回卫国。公元前487年孔子64岁时,时年31岁的“有若”参与了抵抗吴国侵略的军事行动,同年“闵子骞”去世,享年49岁。


        公元前484年,齐国讨伐鲁国,时年38岁的“冉求”帅鲁军与齐军对战获胜。“季康子”问冉有指挥才能从何学来,冉求提到了自己的老师“孔子”。季康子派人以币迎时年67岁的孔子回归鲁国,孔子14年的“周游列国”生涯至此结束。孔子反对季康子诸如“施行田赋”之类的做法。他告诉冉有,应该用“君子礼数”来评价行为是否符合道义。“君子礼数”是施舍的时候,从重付出;做事的时候,中庸而行;死去的时候,对自己薄葬。由于与“季康子”等人在治国理念上谈不拢,孔子虽仍有心从政,但还是被敬而不用。这一年,年龄够格当他弟子的至少有增添“颛孙师”,“冉孺”,“冉季”。


        公元前484年至公元前479年是孔子生命的最后五年,期间他的儿子“孔鲤”,他的弟子“颜回”,“子路”,“石作蜀”相继离世。公元前479年,孔子因病去世,此时活着的弟子中比较杰出的还有41岁的“子贡”,39岁的“有若”,36岁的“原宪”,28岁的“卜商”,27岁的“言偃”,26岁的“曾参”。由于秦始皇“焚书坑儒”时对孔子弟子的生卒年份以及事迹相关史料进行了加强版“和谐”操作,使得死于公元前479年至公元前401年之间的那些“孔门七十二贤”除了姓名,极少能留下蛛丝马迹。太史公司马迁在《史记卷六十七.仲尼弟子列传第七》留存下相关记载的,基本也只限于“孔门十哲”。 


#
RenMin = [
    ['孔子', -551, -479],
    ['老子', -571, -471],
    ['蘧伯玉', -585, -484],
    ['晏婴', -578, -500],
    ['老莱子', -599, -479],
    ['子产', '?', -522],
    ['臧文仲', '?', -617],
    ['柳下惠', -720, -621],
    
    

    #十哲
    ['颜回_子渊', -521, -481],
    ['闵损_子骞', -536, -487],
    ['冉耕_伯牛', -544, '?'],
    ['冉雍_仲弓', -522, '?'],
    ['冉求_子有', -522, '?'],
    ['仲由_子路', -542, -480],
    ['宰予_子我', -522, -458],
    ['端木赐_子贡', -520, -456],
    ['言偃_子游', -506, -443],
    ['卜商_子夏', -507, '?'],
    #七十二贤
    ['颛孙师_子张', -503, '?'],
    ['曾参_子舆', -505, -435],
    ['澹台灭明_子羽', -512, '?'],
    ['宓不齐_子贱', -521, -445],
    ['原宪_子思', -515, '?'],
    ['公冶长_子长', '?', '?'],
    ['南宫适_子容', '?', '?'],
    ['公皙哀_季次', '?', '?'],
    ['曾点_皙', -545, '?'],
    ['颜路', -545, '?'],
    ['商瞿_子木', -522, '?'],
    ['高柴_子羔', -521, '?'],
    ['司马耕_子牛', '?', '?'],
    ['樊须_子迟', -505, '?'],
    ['有若_子有', -518, '?'],
    ['公西赤_子华', -509, '?'],
    ['巫马施_子期', -521, '?'],
    ['梁鳣_叔鱼', -522, '?'],
    ['颜幸_子柳', -503, '?'],
    ['冉孺_子鲁', -501, '?'],
    ['曹恤_子循', -501, '?'],
    ['伯虔_子折', -501, '?'],
    ['冉季_子产', -498, '?'],
    ['公祖句兹_子之', '?', '?'],
    ['秦祖_子南', '?', '?'],
    ['漆雕哆_子敛', '?', '?'],
    ['颜高_子骄', '?', '?'],
    ['漆雕徒父_子文', '?', '?'],
    ['壤驷赤_子徒', '?', '?'],
    ['商泽_子秀', '?', '?'],
    ['石作蜀_子明', -519, -479],
    ['任不齐_子选', -545, -468],
    ['公良孺_子正', '?', '?'],
    ['后处_子里', '?', '?'],
    ['秦冉_子开', '?', '?'],
    ['公夏首_秦', '?', '?'],
    ['奚容箴_子皙', '?', '?'],
    ['公肩定_子中', '?', '?'],
    ['颜相', '?', '?'],
    ['鄡单_子家', '?', '?'],
    ['句井疆' , '?', '?'],
    ['罕父黑', '?', '?'],
    ['秦商_子丕', -547, '?'],
    ['申党_子周','?', '?'],
    ['颜之仆_叔', '?', '?'],
    ['荣旗_子祈', -542, -470],
    ['县成_子祺', '?', '?'],
    ['左人郢_子行', '?', '?'],
    ['燕伋_思', -541, -476],
    ['郑邦_子徒', '?', '?'],
    ['秦非_子之', '?', '?'],
    ['施之常_子恒', '?', '?'],
    ['颜哙_子声', '?', '?'],
    ['步叔乘_子车', '?', '?'],
    ['原亢籍', '?', '?'],
    ['乐欬', '?', '?'],
    ['廉絜_子庸', '?', '?'],
    ['叔仲会_子期', -501, '?'],
    ['颜何_冉', '?', '?'],
    ['狄黑_皙', '?', '?'],
    ['邦巽_子敛', '?', '?'],
    ['孔忠', '?', '?'],
    ['公西舆如', '?', '?'] 
    
];
    


def tmp():
    t = NianHaoTree();
    #for item in DongZhou:
    for item in RenMin:
        t.addElem(NianHao(item[0], item[1], item[2]));

    year = -500;
    year2 = -479
    a = t.searchPeople(year);
    for i in range(len(a)):
        a[i] = a[i][:-3];


    b = t.searchPeople(year2);
    print(b);
    for i in range(len(b)):
        b[i] = b[i][:-3];
    c = set(b).difference(set(a));
    print(c);


    print(' -------');
    t1 = NianHaoTree();
    for item in DongZhou:
        t1.addElem(NianHao(item[0], item[1], item[2]));

    print(t1.search(year));

    #print(t.search(-538));
    #print(t.searchName('齐'));
    #print(t.calcYear('晋献公', 22));
#

#
import struct;
import math;
import random;


#把十进制数按照小尾字节序切割
def littleEndian(number, byte = 4):
    result = [0]*byte;

    for i in range(byte):
        result[i] = number%256;
        number//=256;
    return result;
    

#把UltraEdit中的值字串转化为hex序列组
def hexExpr(string):
    resultString = '';
    size = len(string);
    for i in range(size):
        if (i == 0 ):
            resultString += '0x'+string[i];
        elif (string[i] == ' '):
            resultString += ', 0x';
        else:
            resultString += string[i];
    print(resultString);


###
# @usage   写.wav文件,能把声波数据阵列用二进制写成.wav。
# @author  mw
# @date    2016年04月28日  星期四  14:31:34 
# @param
# @return
#
###
def writeWav(index , filename):
    
    byteArray = [];
    dataArray = [];

    mode = 1;
    
    #样本数据阵列
    sampleArray = songArray();


    #样本数据点数
    N = len(sampleArray);
    times = 1;
    dataSize = N*times;
    
    fileSize = dataSize+44; #44为格式头部分所用字节数
    
    #RIFF WAVE CHUNK
    RIFF_ID = [0x52, 0x49, 0x46, 0x46];  #'RIFF'
    RIFF_Size = littleEndian(fileSize-8, 4); #文件总字节数减去8
    RIFF_Type = [0x57, 0x41,0x56, 0x45, 0x66, 0x6D, 0x74, 0x20]; #'WAVEfat '

    #Format Chunk
    Format_10_17 = [0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00];#过滤4+格式2+声道2=8个字节
    Format_18_1B = [0x11, 0x2B, 0x00, 0x00]; #采样频率0x2B11 = 11025
    Format_1C_1F = [0x22, 0x56, 0x00, 0x00]; #比持率 = 频率*通道*样本位 = 22050
    Format_20_23 = [0x02, 0x00, 0x10, 0x00]; #块对齐 = 通道数* 样本位数 = 1*2 = 2    

    #Fact Chunk(optional)

    #Data Chunk
    Data_24_27 = [0x64, 0x61, 0x74, 0x61]; #'DATA'标记
    Data_Size = littleEndian(fileSize-44, 4); #下面的Data部分的字节数,文件总字节数-44


    #RIFF WAVE CHUNK
    '''
    for i in range(4):
        byte = struct.pack('B', RIFF_ID[i]);
        byteArray.append(byte);
    '''

    RIFF = [b'R', b'I', b'F', b'F'];
    for i in range(4):
        byteArray.append(RIFF[i]);

    for i in range(4):
        byte = struct.pack('B', RIFF_Size[i]);
        byteArray.append(byte);

    '''
    for i in range(8):
        byte = struct.pack('B', RIFF_Type[i]);
        byteArray.append(byte);

    #Format Chunk
    for i in range(8):
        byte = struct.pack('B', Format_10_17[i]);
        byteArray.append(byte);

    for i in range(4):
        byte = struct.pack('B', Format_18_1B[i]);
        byteArray.append(byte);

    for i in range(4):
        byte = struct.pack('B', Format_1C_1F[i]);
        byteArray.append(byte);

    for i in range(4):
        byte = struct.pack('B', Format_20_23[i]);
        byteArray.append(byte);

    
    #Data Chunk
    for i in range(4):
        byte = struct.pack('B', Data_24_27[i]);
        byteArray.append(byte);
    '''

    #Format_28_2B是数据块大小,formatHead是它前面的所有部分
    formatHead = [b'W', b'A', b'V', b'E', b'f', b'm', b't', b' ', \
                  b'\x10', b'\x00', b'\x00', b'\x00', b'\x01', b'\x00', b'\x01', b'\x00', \
                  b'\x11', b'+', b'\x00', b'\x00', \
                  b'"', b'V', b'\x00', b'\x00', \
                  b'\x02', b'\x00', b'\x10', b'\x00', \
                  b'd', b'a', b't', b'a'];

    for i in range(len(formatHead)):
        byteArray.append(formatHead[i]);

    for i in range(4):
        byte = struct.pack('B', Data_Size[i]);
        byteArray.append(byte);


    #写出到文件
    print('文件写入开始。>>>');

    s = '';
    if mode == 1:
        s = filename+'_'+str(index)+'.wav';
    elif mode == 2:
        s = 'randMusic'+str(index)+'.wav';
        
    fout= open(s, 'wb');
    size = len(byteArray);
    
    for i in range(size):
        fout.write(byteArray[i]);       
    
    size = len(sampleArray);   
    
    for j in range(times):
        for i in range(size):
            fout.write(sampleArray[i]);

    fout.close();
    print('文件写入完毕。');


#生成声音样本,返回样本矩阵
def sampleGen(N, freq):
    #设立20000个数值点,约可听2秒
    sampleArray = [];

    coef = 2*math.pi*freq/11025;

  
    for i in range(N):
        xvalue = coef*i;
        
        yvalue = math.sin(xvalue)
		
        if (yvalue < 0):
            yvalue *= 32768/2;
        else:
            yvalue *= 32767/2;
        sampleArray.append(round(yvalue));
    return sampleArray;


def waveDataGen(freq):
    N = 200;

    sampleArray = sampleGen(N, freq);
    dataArray = [];
    
    for i in range(N):
        value = littleEndian(sampleArray[i], 2);
        for j in range(2):
            byte = struct.pack('B', value[j]);
            dataArray.append(byte);    

    return dataArray;

def genIdle():
    dataArray = [];
    
    for i in range(200):
        value = littleEndian(0, 2);
        for j in range(2):
            byte = struct.pack('B', value[j]);
            dataArray.append(byte);    

    print(dataArray);






#生成声波数据
def tmp2():
    print('生成波形开始。>>>');
    
    fout= open('output.txt', 'w');

    frequence = list(range(100, 7100, 100));

    size = len(frequence);
    
    for i in range(size):
        dataStr = 'assistFreq_'+str(frequence[i]).replace('.', 'p') + ' = [';
        fout.write(dataStr);

        data = waveDataGen(frequence[i]);
        size_1 = len(data);

        for n in range(size_1):
            fout.write(str(data[n]));
            if (n < size_1-1):
                fout.write(', ');

        fout.write('];');
            
        fout.write('\r\n');

    fout.close();
    print('生成波形结束,请到output.txt查收。');

import voice.song as Song;

#歌曲数据
def songArray():
    #频率
    FreqPiano = [[27.500, 29.135, 30.867, 32.702, 34.647, 36.707, 
        38.890, 41.203, 43.653, 46.249, 48.999, 51.913], #O1
        [55.000, 58.270, 61.735, 65.406, 69.295, 73.416, 
        77.782, 82.407, 87.307, 92.499, 97.999, 103.826], #O2
        [110.000, 116.541, 123.471, 130.813, 138.592, 146.833, 
        155.564, 164.814, 174.614, 184.997, 195.997, 207.652], #O3
        [220.000, 233.082, 246.942, 261.626, 277.183, 293.665, 
        311.127, 329.628, 349.229, 369.995, 391.996, 415.305], #O4
        [440.000, 466.164, 493.884, 523.252, 554.366, 587.330, 
        622.254, 659.255, 698.456, 739.988, 783.990, 830.608], #O5
        [879.999, 932.326, 987.765, 1046.501, 1108.729, 1174.657, 
        1244.506, 1318.508, 1396.911, 1479.976, 1567.980, 1661.217], #O6
        [1759.998, 1864.653, 1975.531, 2093.002, 2217.458, 2349.315, 
        2489.013, 2637.017, 2793.822, 2959.951, 3135.959, 3322.433]] #O7

    #调式
    toneChoose = 3;

    if (toneChoose == 1):
        Tone = [['C', [1, 3, 5, 6, 8, 10, 12]], #以CDEFGAB顺序排音 'a'
                ['G', [1, 3, 5, 7, 20, 22, 24]], #'e'
                ['D', [2, 15, 17, 19, 20, 22, 24]],  #'b'
                ['A', [2, 3, 5, 7, 9, 22, 24]], #'#f'
                ['E', [2, 4, 17, 19, 21, 22, 24]], #'#c'
                ['B', [2, 4, 5, 7, 9, 11, 24]] #['B', [14, 16, 17, 19, 21, 23, 12]] #'#g'
                ];
    elif (toneChoose == 2):
        #调式
        Tone = [['C', [1, 3, 5, 6, 8, 10, 12]], #以CDEFGAB顺序排音 'a'
                ['G', [13, 15, 17, 19, 8, 10, 12]], #'e'
                ['D', [14, 3, 5, 7, 8, 10, 12]],  #'b'
                ['A', [14, 15, 17, 19, 21, 10, 12]], #'#f'
                ['E', [14, 16, 5, 7, 9, 10, 12]], #'#c'
                ['B', [14, 16, 17, 19, 21, 23, 24]] #['B', [14, 16, 17, 19, 21, 23, 12]] #'#g'
                ];
    else:
        #调式
        Tone = [['C', [1, 3, 5, 6, 8, 10, 12]], #以CDEFGAB顺序排音 'a'
                ['G', [1, 3, 5, 7, 8, 10, 12]], #'e'
                ['D', [2, 3, 5, 7, 8, 10, 12]],  #'b'
                ['A', [2, 3, 5, 7, 9, 10, 12]], #'#f'
                ['E', [2, 4, 5, 7, 9, 10, 12]], #'#c'
                ['B', [2, 4, 5, 7, 9, 11, 12]], #['B', [14, 16, 17, 19, 21, 23, 12]] #'#g'
                ['#F', [2, 4, 6, 7, 9, 11, 12]],
                ['#C', [2, 4, 6, 7, 9, 11, 13]]
                ];
    
    #强弱节拍
    strong = [[1.0, 0.8, 0.9, 0.8], #4/4拍
              [1.0, 0.8, 0.8], #3/4拍
              [1.0, 0.9], #2/4拍
              [1.0, 0.8, 0.7, 1.0, 0.8, 0.7] #6/8拍
              ];
    #旋律
    #music = Song.JuanZhuLian;
    music = Song.HaoHanGe;

    print('曲谱检查开始');

    #乐谱简单检查
    for i in range(1, len(music)):
        len_ = len(music[i]);
        if (len_%2 != 0):
            raise Exception('第{0}节歌曲--{1}--数据有误,请检查!'.format(i, music[i]));

        totalendure = 0;
        if (len_ != 0):
            for j in range(0, len_, 2):            
                totalendure += music[i][j+1];

            if (round(totalendure * 16))%4 != 0:
                raise Exception('第{0}节歌曲--{1}--数据有误,请检查!'.format(i, music[i]));


    print('根据调式选音开始');
  
    keyFreq = [];
    key = [];
    level = 3;
    if (music[0][0] == 'C'): #C大调 
        key = Tone[0][1];
    elif (music[0][0] == 'G'): #G大调 
        key = Tone[1][1];
    elif (music[0][0] == 'D'): #D大调 
        key = Tone[2][1];
    elif (music[0][0] == 'A'): #A大调 
        key = Tone[3][1];
    elif (music[0][0] == 'E'): #E大调 
        key = Tone[4][1];
    elif (music[0][0] == 'B'): #B大调 
        key = Tone[5][1];
    elif (music[0][0] == '#F'): #
        key = Tone[6][1];
    elif (music[0][0] == '#C'): #
        key = Tone[7][1];
    else:
        pass;

    #print(key);

    for j in range(3): #低中高三阶音, 共21个键的音
        keyFreq_ = [];
        for i in range(7):
            freq_ = key[i]+2;

            '''
            if key[i]%12 > 9 or key[i]%12 < 1:
                freq_ -= 12;
            '''
            
            
            if (freq_ >= 24):
                keyFreq_.append(FreqPiano[level+j+1][freq_ - 24]);
            elif (freq_ >= 12):
                keyFreq_.append(FreqPiano[level+j][freq_ - 12]);
            else:
                keyFreq_.append(FreqPiano[level+j-1][freq_]);
        keyFreq.append(keyFreq_);

    print(keyFreq);

    
    #每拍时间
    clapendure = 60/music[0][3];
    #二进制数据
    data = [];
    #切分音使用指示
    continuous = True;

    print('--歌曲数据生成开始--');

    if (music[0][1] == 4 and music[0][2] == 4): #4/4拍
        clap = strong[0]; #拍子强弱
        #上一个音符
        lastkey = 0;
        #波形相位
        lastphase = 0;

        for k in range(1, len(music)):
            start = 0;
            clapsection = 0;
            explode = []; #小节内分解

            for j in range(0, len(music[k]), 2):
                #print(music[i][j], end = ', ');
                endure = music[k][j+1]; #持续时间
                #print('i', i, 'j', j);
                #print(endure);


                if (continuous == False):
                    #不使用切分音的场合,同一个音符轻重不同
                    spare = 0.25 - start;
                    if (spare >= endure):
                        explode.append([music[k][j], endure, clap[clapsection]]);
                    else:
                        if (start + endure > 0.75):
                            explode.append([music[k][j], spare, clap[clapsection]]);
                            explode.append([music[k][j], 0.25, clap[clapsection+1]]);
                            explode.append([music[k][j], 0.25, clap[clapsection+2]]);
                            start = endure-0.5-spare;
                            explode.append([music[k][j], start, clap[clapsection+3]]);
                            clapsection += 3;
                        elif (start + endure > 0.5):
                            explode.append([music[k][j], spare, clap[clapsection]]);
                            explode.append([music[k][j], 0.25, clap[clapsection+1]]);
                            start = endure-0.25-spare;
                            explode.append([music[k][j], start, clap[clapsection+2]]);
                            clapsection += 2;
                        elif (start + endure > 0.25):
                            explode.append([music[k][j], spare, clap[clapsection]]);
                            start = endure-spare;
                            explode.append([music[k][j], start, clap[clapsection+1]]);
                            clapsection += 1;
                        else:
                            pass;
                            
                else: #使用切分音
                    explode.append([music[k][j], endure, clap[clapsection]]);
                    start += endure;
                    if (start >= 0.75):
                        start -= 0.75;
                        clapsection = 3;
                    elif (start >= 0.5):
                        start -= 0.5;
                        clapsection = 2;
                    elif start >= 0.25:
                        start -= 0.25;
                        clapsection = 1;
                    else:
                        clapsection = 0;
                    

            for i in range(len(explode)):
                endure_ = explode[i][1]/0.25*clapendure;
                if (continuous == False):
                    if (explode[i][0] == 0): #空音                    
                        data += zeropack(endure_);
                    elif (explode[i][0] > 10): #高音
                        freq_ = keyFreq[2][explode[i][0]-10-1];
                        data += wavepack(datawave(freq_, endure_, explode[i][2]));
                    elif (explode[i][0] < 0): #低音
                        freq_ = keyFreq[0][explode[i][0]+10-1];
                        data += wavepack(datawave(freq_, endure_, explode[i][2]));
                    else:
                        freq_ = keyFreq[1][explode[i][0]-1];
                        data += wavepack(datawave(freq_, endure_, explode[i][2]));
                else:
                    if (explode[i][0] == 0): #空音                    
                        data += zeropack(endure_);
                        lastkey = 0;
                        lastphase = 0;
                    else:
                        if (explode[i][0] > 10):
                            freq_ = keyFreq[2][explode[i][0]-10-1];
                        elif (explode[i][0] < 0):
                            freq_ = keyFreq[0][explode[i][0]+10-1];
                        else:
                            freq_ = keyFreq[1][explode[i][0]-1];

                        if (i == 0 and explode[i][0] == lastkey):
                            lastphase, data_ = datawave_con(freq_, endure_, explode[i][2], lastphase);
                        else:
                            lastphase, data_ = datawave_con(freq_, endure_, explode[i][2], 0);

                        data += wavepack(data_);
                        lastkey = explode[i][0];

                            

                        
    else: #其它节奏
        pass;

    #print(data[:100]);
    #print(len(data));
    return data;
                    
                    
                    
    
#波形数据
def datawave(freq, endure, strong):
    #传入频率、持续时间,拍子强度
    #设立20000个数值点,约可听2秒
    sampleArray = [];

    coef = 2*math.pi*freq/11025;

    N = round(endure*11025);
    for i in range(N):
        xvalue = coef*i;
        
        yvalue = math.sin(xvalue)
		
        if (yvalue < 0):
            yvalue *= strong * 32768/2;
        else:
            yvalue *= strong * 32767/2;
        sampleArray.append(round(yvalue));
    return sampleArray;

#波形数据,用于切分音
def datawave_con(freq, endure, strong, startphase):
    #传入频率、持续时间,拍子强度
    #设立20000个数值点,约可听2秒
    sampleArray = [];

    coef = 2*math.pi*freq/11025;

    N = round(endure*11025);
    for i in range(startphase, startphase+N):
        xvalue = coef*i;
        
        yvalue = math.sin(xvalue)
		
        if (yvalue < 0):
            yvalue *= strong * 32768/2;
        else:
            yvalue *= strong * 32767/2;
        sampleArray.append(round(yvalue));
    return i, sampleArray;

#波形压缩成二进制
def wavepack(wavedata):
    dataArray = [];
    for i in range(len(wavedata)):
        value = littleEndian(wavedata[i], 2);
        for j in range(2):
            byte = struct.pack('B', value[j]);
            dataArray.append(byte);    

    return dataArray;

#空音压缩成二进制
def zeropack(endure):
    N = round(endure*11025)//2;
    return [b'\x00', b'\x00']*N;


    




if __name__ == '__main__':
    writeWav(2, 'HaoHanGe_#C');
   

    

#

#
#卷珠帘
JuanZhuLian = [['B', 4, 4, 100], #G大调,4/4拍, 90拍/分钟

#第一节
[5, 6/16, 4, 2/16, 4, 4/16, 3, 4/16],
[2, 6/16, 2, 2/16, 2, 4/16, 1, 2/16, -6, 2/16],
[-6, 2/16, -5, 2/16, -5, 12/16],
[0, 8/16, 4, 4/16, 11, 4/16],
[7, 6/16, 6, 2/16, 6, 4/16, 5, 4/16],
[6, 16/16],
[6, 8/16, 6, 4/16, 11, 2/16, 12, 2/16],
[12, 8/16, 11, 2/16, 12, 1/16, 11, 1/16, 6, 2/16, 5, 2/16],
[5, 8/16, 4, 4/16, 5, 4/16],
[6, 4/16, 5, 2/16, 4, 2/16, 4, 2/16, 5, 1/16, 4, 1/16, 2, 2/16, 1, 2/16],
[2, 12/16, 1, 4/16],
[2, 12/16, 4, 4/16],
#第一尾
[3, 4/16, 1, 2/16, -6, 2/16, 5, 4/16, 4, 2/16, 2, 2/16],
[2, 2/16, 2, 2/16, 2, 12/16],
[2, 16/16],
[0, 16/16],
[0, 16/16],                   

#第二节 基本同第一节
[5, 6/16, 4, 2/16, 4, 4/16, 3, 4/16],
[2, 6/16, 2, 2/16, 2, 4/16, 1, 2/16, -6, 2/16],
[-6, 2/16, -5, 2/16, -5, 12/16],
[0, 8/16, 4, 4/16, 11, 4/16],
[7, 6/16, 6, 2/16, 6, 4/16, 5, 4/16],
[6, 16/16],
[6, 8/16, 6, 4/16, 11, 2/16, 6, 1/16, 11, 1/16],
[12, 8/16, 11, 2/16, 12, 1/16, 11, 1/16, 6, 2/16, 5, 2/16],
[5, 8/16, 4, 4/16, 5, 4/16],
[6, 4/16, 5, 2/16, 4, 2/16, 4, 2/16, 5, 1/16, 4, 1/16, 2, 2/16, 1, 2/16],
[2, 12/16, 1, 4/16],
[2, 12/16, 4, 4/16],
#第二尾
[3, 4/16, 1, 2/16, -6, 2/16, 5, 4/16, 4, 2/16, 2, 2/16],
[2, 2/16, 4, 2/16, 2, 12/16],
[2, 4/16, 0, 4/16, 0, 4/16, 11, 4/16],
[12, 12/16, 12, 2/16, 13, 1/16, 12, 1/16],
[11, 6/16, 12, 1/16, 11, 1/16, 7, 4/16, 6, 4/16],
[7, 4/16, 6, 2/16, 5, 2/16, 2, 8/16],
[2, 8/16, 3, 4/16, 4, 4/16],
[4, 2/16, 11, 2/16, 11, 8/16, 11, 2/16, 11, 1/16, 12, 1/16],
[7, 8/16, 7, 4/16, 6, 2/16, 5, 2/16],
[4, 2/16, 5, 2/16, 6, 12/16],
[0, 12/16, 11, 4/16],                   
[12, 12/16, 12, 2/16, 13, 1/16, 12, 1/16],
[11, 6/16, 12, 1/16, 11, 1/16, 7, 4/16, 6, 2/16, 5, 2/16],
[7, 4/16, 6, 2/16, 5, 2/16, 6, 2/16, 5, 6/16],
[5, 8/16, 6, 4/16, 5, 4/16],
[2, 16/16],
[0, 4/16, 6, 2/16, 5, 2/16, 2, 6/16, 1, 2/16],
[2, 16/16],
[2, 16/16],
[0, 16/16],
[0, 16/16],

#第三节 同第二节
[5, 6/16, 4, 2/16, 4, 4/16, 3, 4/16],
[2, 6/16, 2, 2/16, 2, 4/16, 1, 2/16, -6, 2/16],
[-6, 2/16, -5, 2/16, -5, 12/16],
[0, 8/16, 4, 4/16, 11, 4/16],
[7, 6/16, 6, 2/16, 6, 4/16, 5, 4/16],
[6, 16/16],
[6, 8/16, 6, 4/16, 11, 2/16, 6, 1/16, 11, 1/16],
[12, 8/16, 11, 2/16, 12, 1/16, 11, 1/16, 6, 2/16, 5, 2/16],
[5, 8/16, 4, 4/16, 5, 4/16],
[6, 4/16, 5, 2/16, 4, 2/16, 4, 2/16, 5, 1/16, 4, 1/16, 2, 2/16, 1, 2/16],
[2, 12/16, 1, 4/16],
[2, 12/16, 4, 4/16],
#第三尾
[3, 4/16, 1, 2/16, -6, 2/16, 5, 4/16, 4, 2/16, 2, 2/16],
[2, 2/16, 1, 2/16, 2, 12/16],
[2, 16/16]
];

#好汉歌
HaoHanGe = [['#C', 4, 4, 80], #G大调,4/4拍, 90拍/分钟
            #引子
            [12, 2/16, 12, 2/16, 11, 2/16, 12, 6/16, 0, 4/16],
            [12, 2/16, 12, 2/16, 11, 2/16, 12, 6/16, 0, 4/16],
            #第一节
            [5, 4/16, 15, 4/16, 7, 2/16, 7, 1/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [11, 2/16, 11, 1/16, 6, 1/16, 5, 2/16, 5, 2/16, 13, 1/16, 13, 2/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 15, 2/16, 0, 2/16, 15, 2/16, 11, 2/16, 6, 1/16, 11, 1/16, 12, 2/16, 12, 2/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 3, 1/16, 2, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            [5, 4/16, 15, 4/16, 7, 2/16, 7, 1/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [11, 2/16, 11, 1/16, 6, 1/16, 5, 2/16, 5, 2/16, 13, 1/16, 13, 2/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 15, 2/16, 5, 2/16, 15, 2/16, 13, 1/16, 12, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 13, 1/16, 12, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            #第一节,第二遍
            [5, 4/16, 15, 4/16, 7, 2/16, 7, 1/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [11, 2/16, 11, 1/16, 6, 1/16, 5, 2/16, 5, 2/16, 13, 1/16, 13, 2/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 15, 2/16, 0, 2/16, 15, 2/16, 11, 2/16, 6, 1/16, 11, 1/16, 12, 2/16, 12, 2/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 3, 1/16, 2, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            [5, 4/16, 15, 4/16, 7, 2/16, 7, 1/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [11, 2/16, 11, 1/16, 6, 1/16, 5, 2/16, 5, 2/16, 13, 1/16, 13, 2/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 15, 2/16, 5, 2/16, 15, 2/16, 13, 1/16, 12, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 13, 1/16, 12, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            
            #副歌
            [13, 3/16, 13, 1/16, 13, 2/16, 13, 2/16, 13, 1/16, 15, 1/16, 6, 2/16, 11, 2/16, 11, 2/16],
            [15, 3/16, 6, 1/16, 5, 2/16, 5, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 11, 2/16, 5, 2/16, 11, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            #副歌
            [13, 3/16, 13, 1/16, 13, 2/16, 13, 2/16, 13, 1/16, 15, 1/16, 6, 2/16, 11, 2/16, 11, 2/16],
            [15, 3/16, 6, 1/16, 5, 2/16, 5, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 11, 2/16, 5, 2/16, 11, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            #第二节
            [15, 3/16, 13, 1/16, 12, 4/16, 13, 1/16, 13, 2/16, 11, 1/16, 12, 4/16],
            [0, 2/16, 15, 2/16, 14, 2/16, 15, 2/16, 16, 1/16, 11, 1/16, 13, 2/16, 12, 4/16],
            [15, 3/16, 13, 1/16, 12, 4/16, 13, 2/16, 11, 2/16, 12, 4/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 3, 1/16, 2, 1/16, 11, 2/16, 12, 4/16],
            [13, 3/16, 13, 1/16, 13, 2/16, 13, 2/16, 13, 1/16, 15, 1/16, 6, 2/16, 11, 2/16, 11, 2/16],
            [15, 3/16, 6, 1/16, 5, 2/16, 5, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 11, 2/16, 5, 2/16, 11, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [-5, 2/16, 5, 2/16, -5, 2/16, 5, 2/16, 4, 2/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [-5, 2/16, 5, 2/16, -5, 2/16, 5, 2/16, 4, 2/16, 4, 2/16, 5, 2/16, 5, 2/16],

            #第二遍
            #第一节
            [5, 4/16, 15, 4/16, 7, 2/16, 7, 1/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [11, 2/16, 11, 1/16, 6, 1/16, 5, 2/16, 5, 2/16, 13, 1/16, 13, 2/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 15, 2/16, 0, 2/16, 15, 2/16, 11, 2/16, 6, 1/16, 11, 1/16, 12, 2/16, 12, 2/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 3, 1/16, 2, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            [5, 4/16, 15, 4/16, 7, 2/16, 7, 1/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [11, 2/16, 11, 1/16, 6, 1/16, 5, 2/16, 5, 2/16, 13, 1/16, 13, 2/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 15, 2/16, 5, 2/16, 15, 2/16, 13, 1/16, 12, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 13, 1/16, 12, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            #第一节 第二遍
            [5, 4/16, 15, 4/16, 7, 2/16, 7, 1/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [11, 2/16, 11, 1/16, 6, 1/16, 5, 2/16, 5, 2/16, 13, 1/16, 13, 2/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 15, 2/16, 0, 2/16, 15, 2/16, 11, 2/16, 6, 1/16, 11, 1/16, 12, 2/16, 12, 2/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 3, 1/16, 2, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            [5, 4/16, 15, 4/16, 7, 2/16, 7, 1/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [11, 2/16, 11, 1/16, 6, 1/16, 5, 2/16, 5, 2/16, 13, 1/16, 13, 2/16, 6, 1/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 15, 2/16, 5, 2/16, 15, 2/16, 13, 1/16, 12, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 13, 1/16, 12, 1/16, 11, 2/16, 12, 2/16, 12, 2/16],
            #副歌
            [13, 3/16, 13, 1/16, 13, 2/16, 13, 2/16, 13, 1/16, 15, 1/16, 6, 2/16, 11, 2/16, 11, 2/16],
            [15, 3/16, 6, 1/16, 5, 2/16, 5, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 11, 2/16, 5, 2/16, 11, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            #副歌
            [13, 3/16, 13, 1/16, 13, 2/16, 13, 2/16, 13, 1/16, 15, 1/16, 6, 2/16, 11, 2/16, 11, 2/16],
            [15, 3/16, 6, 1/16, 5, 2/16, 5, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 11, 2/16, 5, 2/16, 11, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            #第二节
            [15, 3/16, 13, 1/16, 12, 4/16, 13, 1/16, 13, 2/16, 11, 1/16, 12, 4/16],
            [0, 2/16, 15, 2/16, 14, 2/16, 15, 2/16, 16, 1/16, 11, 1/16, 13, 2/16, 12, 4/16],
            [15, 3/16, 13, 1/16, 12, 4/16, 13, 2/16, 11, 2/16, 12, 4/16],
            [12, 2/16, 15, 2/16, 12, 2/16, 15, 2/16, 3, 1/16, 2, 1/16, 11, 2/16, 12, 4/16],
            [13, 3/16, 13, 1/16, 13, 2/16, 13, 2/16, 13, 1/16, 15, 1/16, 6, 2/16, 11, 2/16, 11, 2/16],
            [15, 3/16, 6, 1/16, 5, 2/16, 5, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [5, 2/16, 11, 2/16, 5, 2/16, 11, 2/16, 6, 1/16, 5, 1/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [-5, 2/16, 5, 2/16, -5, 2/16, 5, 2/16, 4, 2/16, 4, 2/16, 5, 2/16, 5, 2/16],
            [-5, 2/16, 5, 2/16, -5, 2/16, 5, 2/16, 4, 2/16, 4, 2/16, 5, 2/16, 5, 2/16],
            
            #收尾
            [5, 2/16, 11, 2/16, 5, 2/16, 11, 2/16, 16, 1/16, 15, 1/16, 14, 2/16, 5, 2/16, 5, 2/16],
            [15, 16/16],
            [15, 16/16],
            [15, 4/16, 0, 12/16]
            ];
            
            

#

本节到此结束,欲知后事如何,请看下回分解。
        

本项目属于机器学习的简单部分,基于为了快速理解机器学习而搭建的人工智能速成项目,大家可以根据其中的项目时间进行相关的学习.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值