标准MIDI文件格式

c/c++midi音乐编程——做一架自己的钢琴 在开始之前,我们要先简单介绍一下midi音乐调用的一些函数HMIDIOUT函数midiOutOpen函数midiOutShortMsg函数midiOutClose函数这四个函数是midi音乐编程里最主要的函数,详细介绍请参见c语言midi编程钢琴演奏-优快云博客这里小张同学只带领大家使用,就不再一一介绍了, 阅读详情

标准MIDI文件格式
达思挺·考德威尔

标准的MIDI文件格式就像奇异的兽。总体看来,它是那样的让你无法抗拒。当然,你怎样看它无关紧要,可是用足够多的描述符描述一段音乐并使它能够重现,可不是很少的工作就可以完成的。然而,它虽然复杂,但是真正理解之后,MIDI文件格式的结构还是很直观明了的。

在这里我必须放弃一些东西,因为毕竟我不是MIDI也不是MIDI文件专家!最近我为我的PC准备了一块Gravis 超音频音效卡,利用它听完几段MIDI文件(.mid)之后,想:“呵,我要是能够制作自己的MIDI(.mid)文件该多好啊!”嗯,经过烦人的几个小时之后,我发现,那些并不是没有价值的工作。但是,我是不会让一个冗长的文件格式就能够阻止的(此外,我告诉过我的妻子,计算机不是很难用的,而且我十分憎恨当一个伪君子)。那么,在这篇文章中如果发现什么错误,请让我知道,我会修改它的。同时,这份文档的范围并没有提供所有类型的MIDI命令和任何可能的文件配置!这篇基本指南将使读者能够(以中等的时间投资)制作出MIDI类型的文件。

1.概述:

一个MIDI文件基本上由两个部分组成,头块和轨道块。第二节讲述头块,第三节讲述轨道块。一个MIDI文件有一个头块用来描述文件的格式、许多的轨道块等内容。一个轨道可以想象为像一个大型多音轨录音机那样,你可以为某种声音、某种乐谱、某种乐器或者你需要的任何东西分配一个轨道。

2.头块:

头块出现在文件的开头,有三种方式来描述文件。头块看起来一直是这样的:
4D 54 68 64 00 00 00 06 ff ff nn nn dd dd

前4个字节等同于ASCII码MThd,接着MThd之后的4个字节是头的大小。它将一直是00 00 00 00 06,因为现行的头信息将一直是6字节。

ff ff是文件的格式,有3种格式:
0-单轨
1-多规,同步
2-多规,异步

单轨,很显然就只有一个轨道。同步多轨意味着所有轨道都是垂直同步的,或者其他的措辞为他们都在同一时间开始,并且可以表现一首歌的不同部分。异步多轨没有必要同时开始,而且可以完全的不同步。

nn nn 是MIDI文件中的轨道数。
dd dd 是每个4分音符delta-time节奏数(这之后将做详细介绍)。

3.轨道块:

头块之后剩下的文件部分是轨道块。每一个轨道包含一个头,并且可以包含你所希望的许多MIDI命令。轨道头与文件头及其相似:

4D 54 72 6B xx xx xx xx

与头一致,前4个字节是ASCII吗,这个是MTrk,紧跟MTrk的4个字节给出了以字节为单位的轨道的长度(不包括轨道头)。

在头之下是MIDI事件,这些事件同现行的可以被带有累加的MIDI合成器端口接受和发送的数据是相同的。一个MIDI 事件先于一个delta-time。一个delta-time是一个MIDI事件被执行后的节奏数,每个四分之一音符的节奏数先前已经定义在了文件的头块中。这个delta-time是一个可变长度的编码值。这种格式虽然混乱,可是允许根据需要利用多位表示较大的数值,这不会因为需求小的数值情况下以添零的方式浪费掉一些字节!数值被转换为7位的字节,并且除了最后一个字节以最高有效位是0外,各个字节最有意义的一位是1,。这就允许一个数值被一次一个字节地读取,你如果发现最高有效位是0,则这就是这个数值的最后一位(意义比较小)。依照MIDI说明,全部delta-time的长度最多超过4字节。

delta-time 之后就是MIDI事件,每个MIDI事件(除了正在运行的事件外)带有一个最高有效位总是1的命令字节(值将>128)。大部分命令的列表在附录A中。每个命令都有不同的参数和长度,但是接下来的数据将是最高有效位为零(值将<128)。这里有个例外就是meta-event,最高有效位可以是1。然而,meta-events需要一个长的参数以区分。

微小失误就可以导致混乱的是运行模式,这是现行MIDI命令所忽略的地方,并且最终发行的MIDI命令是假定的。这就意味这如果包含了命令,那么MIDI事件就是由delta-time与参数组成而转换的。

4.综述:

如果这份说明仅仅是使问题更加混乱,那么以下提供的例子可能有助于澄清问题!同时,两个公用程序和一个图解文件包含在这个文档里面:

DEC.EXE——这个公共程序是将二进制文件(比如.MID)转换成以十进制表示的对应每个字节的有标记界限的文本文件。

REC.EXE——这个公共程序是将有标记界限的十进制数文本文件对应的每一字节转换成二进制文件。

MIDINOTE.PS——这是一个对应键盘和五线谱的音符数字附录页。


附录A

1.MIDI事件命令

每个命令字节有两部分,左nybble(4位)包含现行的命令,右nybble包含将被执行的命令的通道号,这里有16各MIDI通道8个MIDI命令(命令nybble必须最高有效位是1的)。在下表中,X表示MIDI通道号。所有的音符即数据字节都<128(最高有效位是0)。

十六进制 二进制 数据 描述

8x      1000xxxx    nn vv        音符关闭 (释放键盘)
                            nn=音符号
                            vv=速度

9x      1001xxxx    nn vv        音符打开 (按下键盘)
                            nn=音符号
                            vv=速度

Ax      1010xxxx    nn vv        触摸键盘以后
                            nn=音符号
                            vv=速度

Bx      1011xxxx    cc vv        调换控制
                            cc=控制号
                            vv=新值

Cx      1100xxxx    pp            改变程序(片断)
                            pp=新的程序号

Dx      1101xxxx    cc            在通道后接触
cc=管道号

Ex      1110xxxx    bb tt        改变互相咬和的齿轮 (2000H 表明缺省或没有改变)(什么意思搞不懂:)
                            bb=值的低7位(least sig) 
                             tt=值的高7位 (most sig)

下表是没有通道的 meta-events列表 ,他们的格式是:

FF xx nn dd

所有的 meta-events 是以 FF 开头的命令 (xx),长度,或者含在数据的字节数(nn),现行的数据(dd)

十六进制 二进制 数据 描述
00      00000000    nn ssss      设定轨道的序号
                            nn=02 (两字节长度的序号)
                            ssss=序号

01      00000001    nn tt ..      你需要的所有文本事件
                        nn=以字节为单位的文本长度
                            tt=文本字符

02      00000010    nn tt ..      同文本的事件, 但是用于版权信息
                           nn tt=同文本事件

03      00000011  nn tt ..      序列或者轨道名
                         nn tt=同文本事件

04      00000100    nn tt ..      轨道乐器名
                            nn tt=同文本事件

05      00000101    nn tt ..      歌词
                            nn tt=同文本事件

06      00000110    nn tt ..      标签
                            nn tt=同文本事件

07      00000111    nn tt ..      浮点音符
                           nn tt=同文本事件

2F      00101111    00            这个事件一定在每个轨道的结尾出现

51      01010001    03 tttttt    设定拍子
                                tttttt=微秒/四分音符

58      01011000    04 nn dd cc bb 拍子记号
                                nn=拍子记号分子
                                dd=拍子记号分母2=四分之一
                                3=8分拍, 等等.
                                cc=节拍器的节奏
                                bb=对四分之一音符标注的第32号数字

59    01011001    02 sf mi      音调符号
                              sf=升调/降调(-7=7 降调, 0=基准C调,7=7 升调)
                              mi=大调/小调(0=大调, 1=小调)

7F      01111111    xx dd ..      音序器的详细信息
                            xx=被发送的字节数
                            dd=数据

下表列出了控制整个系统的系统消息。这里没有MIDI通道数 (这些一般仅应用于MIDI键盘等.)

十六进制      二进制  数据          描述

F8      11111000                  同步所必须的计时器
FA      11111010                  开始当前的队列
FB      11111011                  从停止的地方继续一个队列
FC      11111100                  停止一个队列

下表列出的是与音符相对应的命令标记。
八度音阶¦¦                    音符号
  #  ¦¦
      ¦¦ C  ¦ C#  ¦ D  ¦ D#  ¦ E  ¦ F  ¦ F#  ¦ G  ¦ G#  ¦ A  ¦ A#  ¦ B
-----------------------------------------------------------------------------
  0  ¦¦  0 ¦  1 ¦  2 ¦  3 ¦  4 ¦  5 ¦  6 ¦  7 ¦  8 ¦  9 ¦  10 ¦ 11
  1  ¦¦  12 ¦  13 ¦  14 ¦  15 ¦  16 ¦  17 ¦  18 ¦  19 ¦  20 ¦  21 ¦  22 ¦ 23
  2  ¦¦  24 ¦  25 ¦  26 ¦  27 ¦  28 ¦  29 ¦  30 ¦  31 ¦  32 ¦  33 ¦  34 ¦ 35
  3  ¦¦  36 ¦  37 ¦  38 ¦  39 ¦  40 ¦  41 ¦  42 ¦  43 ¦  44 ¦  45 ¦  46 ¦ 47
  4  ¦¦  48 ¦  49 ¦  50 ¦  51 ¦  52 ¦  53 ¦  54 ¦  55 ¦  56 ¦  57 ¦  58 ¦ 59
  5  ¦¦  60 ¦  61 ¦  62 ¦  63 ¦  64 ¦  65 ¦  66 ¦  67 ¦  68 ¦  69 ¦  70 ¦ 71
  6  ¦¦  72 ¦  73 ¦  74 ¦  75 ¦  76 ¦  77 ¦  78 ¦  79 ¦  80 ¦  81 ¦  82 ¦ 83
  7  ¦¦  84 ¦  85 ¦  86 ¦  87 ¦  88 ¦  89 ¦  90 ¦  91 ¦  92 ¦  93 ¦  94 ¦ 95
  8  ¦¦  96 ¦  97 ¦  98 ¦  99 ¦ 100 ¦ 101 ¦ 102 ¦ 103 ¦ 104 ¦ 105 ¦ 106 ¦ 107
  9  ¦¦ 108 ¦ 109 ¦ 110 ¦ 111 ¦ 112 ¦ 113 ¦ 114 ¦ 115 ¦ 116 ¦ 117 ¦ 118 ¦ 119
  10  ¦¦ 120 ¦ 121 ¦ 122 ¦ 123 ¦ 124 ¦ 125 ¦ 126 ¦ 127 ¦

参考资料:
"MIDI Systems and Control" Francis Rumsey  1990 Focal Press
"MIDI and Sound Book for the Atari ST" Bernd Enders and Wolfgang Klem 1989 M&T Publishing, Inc.
MIDI file specs and general MIDI specs were also obtained by sending e-mail to LISTSERV@AUVM.AMERICAN.EDU with the phrase GET MIDISPEC PACKAGE in the message.
------------------------------ DEC.CPP ------------------------------------

/*  file  dec.cpp

by  Dustin Caldwell    (dustin@gse.utah.edu)

*/


#include <dos.h>
#include <stdio.h>
#include <stdlib.h>

void helpdoc();

main()
{
        FILE *fp;

        unsigned char ch, c;

        if((fp=fopen(_argv[1], "rb"))==NULL)            /* open file to read */
        {
                printf("cannot open file %s/n",_argv[1]);
                helpdoc();
                exit(-1);
        }

        c=0;
        ch=fgetc(fp);

        while(!feof(fp))                        /* loop for whole file */
        {
                printf("%u/t", ch);            /* print every byte's decimal equiv. */
                c++;
                if(c>8)                                /* print 8 numbers to a line */
                {
                        c=0;
                        printf("/n");
                }

                ch=fgetc(fp);
        }

        fclose(fp);                    /* close up */
}

void helpdoc()                  /* print help message */
{
        printf("/n  Binary File Decoder/n/n");

        printf("/n Syntax:  dec binary_file_name/n/n");

        printf("by Dustin Caldwell  (dustin@gse.utah.edu)/n/n");
        printf("This is a filter program that reads a binary file/n");
        printf("and prints the decimal equivalent of each byte/n");
        printf("tab-separated. This is mostly useful when piped /n");
        printf("into another file to be edited manually.  eg:/n/n");
        printf("c:/>dec sonata3.mid > son3.txt/n/n");
        printf("This will create a file called son3.txt which can/n");
        printf("be edited with any ascii editor. /n/n");
        printf("(rec.exe may also be useful, as it reencodes the /n");
        printf("ascii text file)./n/n");
        printf("Have Fun!!/n");
}

---------------------------- REC.CPP ----------------------------------

/*  File  rec.cpp
        by Dustin Caldwell  (dustin@gse.utah.edu)
*/

#include <dos.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

void helpdoc();

main()
{
        FILE *rfp, *wfp;

        unsigned char ch, c;
        char s[20];

        if((rfp=fopen(_argv[1], "r"))==NULL)                    /* open the read file */
        {
                printf("cannot open file %s /n",_argv[1]);
                helpdoc();
                exit(-1);
        }

        if((wfp=fopen(_argv[2], "wb"))==NULL)                  /* open the write file */
        {
                printf("cannot open file %s /n",_argv[1]);
                helpdoc();
                exit(-1);
        }

        c=0;

        ch=fgetc(rfp);

        while(!feof(rfp))                      /* loop for whole file */
        {

                if(isalnum(ch))                /* only 'see' valid ascii chars */
                {
                        c=0;
                        while(isdigit(ch))      /* only use decimal digits (0-9) */
                        {
                                s[c]=ch;        /* build a string containing the number */
                                c++;
                                ch=fgetc(rfp);
                        }
                        s[c]=NULL;                      /* must have NULL terminator */

                        fputc(atoi(s), wfp);/* write the binary equivalent to file */

                }

                ch=fgetc(rfp);                  /* loop until next number starts */


        }

        fclose(rfp);                    /* close up */
        fclose(wfp);
}


void helpdoc()          /* print help message */
{
        printf("/n  Text File Encoder/n/n");

        printf("/n Syntax:  rec text_file_name binary_file_name/n/n");

        printf("by Dustin Caldwell  (dustin@gse.utah.edu)/n/n");
        printf("This is a program that reads an ascii tab-/n");
        printf("delimited file and builds a binary file where/n");
        printf("each byte of the binary file is one of the decimal/n");
        printf("digits in the text file./n");
        printf(" eg:/n/n");
        printf("c:/>rec son3.txt son3.mid/n/n");
        printf("(This will create a file called son3.mid which is/n");
        printf("a valid binary file)/n/n");
        printf("(dec.exe may also be useful, as it decodes binary files)/n/n");
        printf("Have Fun!!/n");
}

Python与Arduino绘制超声波雷达扫描 前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧! 在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端? 这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦! 我先写了一个测试程序试了一下,OK!搞定 阅读详情

相关推荐

midi播放库,可转mp3使用不同的音色库

C-C++midi播放库,可转mp3使用不同的音色库

音乐研发必备:理解 MIDI 协议与标准 MIDI 文件格式

动手点关注干货不迷路????1. MIDI 简介MIDI 协议即数字音乐接口(Musical Instrument Digital Interface),是电子乐器、合成器等演奏设备之间的一种即时通信协议,用于硬件之间的实时演奏数据传递。MIDI 协议诞生之初希望解决的事情是通过统一通信协议让不同乐器制造商的设备可以互相兼容,比如把 Roland 键盘接入 Yamaha 合...

字节跳动技术团队官方博客 4543

midi 文件C++解析库

解析midi文件的c++库,如何使用看main.cpp,src里面的代码用来创建一个静态库

C++MIDI编程

C++midi编程 在c语言的win32api中,windows.h里有专门播放midi的API。这些api的调用需要链接winmm.lib。 #include <Windows.h> #pragma comment(lib,"winmm.lib") 我们来看一下MIDI相关的API //打开mid设备 MMRESULT midiOutOpen( _Out_ LPHMIDIO...

qq_39096769的博客 1万+

使用C++和MIDI演示键盘钢琴发音原理

使用vc++演示的MIDI键盘钢琴发音原理的代码,小伙伴们可以通过查看代码对midi的使用有一个基本的了解。

win11本地部署openclaw实操第1集

OpenClaw 是一款开源、本地优先、可自托管的 AI 智能体(AI Agent)网关 / 自动化框架,核心是让 AI 从 “只聊天、给建议” 变成 “能在你电脑上真做事” 的数字助手。

weixin_44626085的博客 7127

c语言怎么解析midi文件,C++读取midi文件出现问题

本人用C++读取midi文件时发现部分字节会自动跳过。每当读到090a0b0c0d时就读不出来,其他都可以正常读取。读取文件的代码如下stringgetMidiData(charmidi[])//读取midi文件{ifstreamin(midi,ios::binary);//将midi文件打开if(!in){cerr<exit(1);}//假如打开失败,则结束程序unsigne...

weixin_39622123的博客 842

C++语言程序设计教程第4版杨进才沈显君课后习题答案解析

为了更好地学习这门课程,我尝试在网上寻找一些学习资料和参考书籍,但效果并不是很理想。因此,我希望能有一些学长学姐或者是有经验的程序员能够分享一些学习经验和方法,让我更好地掌握这门课程。学习过程中,我发现这本书的内容非常丰富,讲解也非常详细,对于像我这样编程基础薄弱的学生来说,是一本非常实用的教材。同时,我也希望有经验的程序员能够推荐一些适合初学者的C++语言学习资料和工具,以便我能更好地学习和掌握这门课程。总之,希望能得到大家的帮助和支持,让我更好地学习和掌握C++语言程序设计。主 编: 杨进才,沈显君。

weixin_58833001的博客 1332

[C/C++]标准MIDI文件格式

标准的MIDI文件格式就像奇异的兽。总体看来,它是那样的让你无法抗拒。当然,你怎样看它无关紧要,可是用足够多的描述符描述一段音乐并使它能够重现,可不是很少的工作就可以完成的。然而,它虽然复杂,但是真正理解之后,MIDI文件格式的结构还是很直观明了的。在这里我必须放弃一些东西,因为毕竟我不是MIDI也不是MIDI文件专家!最近我为我的PC准备了一块Gravis 超音频音效卡,利用它听完几段M

[橫渡] 5306

LAMMPS实战指南 - 从in文件到分子动力学模拟的完整流程解析

本文详细解析了LAMMPS分子动力学模拟的完整流程,从理解in文件的核心作用与基础结构开始,逐步指导如何创建模拟体系、选择势函数、进行能量最小化与初始化,并深入讲解了NVT/NPT系综弛豫与生产模拟的关键步骤。文章还提供了常见问题的避坑指南与实战技巧,帮助初学者快速掌握从编写in文件到成功运行模拟的全过程。

weixin_28365523的博客 395

逆向攻防世界CTF系列40-ReverseMe-120

注意sub_401000main中只传了两个参数,但是跟进后发现四个(可能是隐式传递,放在寄存器里传递了),调试发现a4是输入长度,与最终的you_know_how_to_remove_junk_code比较的是v12(但是并没有被传入),开始怀疑是不是隐式传递了。_mm_xor_si128用于计算128位(16字节)的按位异或,然后通过v14控制循环结束的条件,可以看到v14增长的步长为16,而且通过上面得到的flag值解码得到的字符串为32个字节大小,正好是16的整数倍。

LH1013886337的博客 1410

标准MIDI文件格式规范。 1.1(机翻)

0-简介 本文档概述了MIDI文件的规范。 MIDI文件的目的是提供一种在相同或不同计算机上的不同程序之间交换带时间戳的MIDI数据的方法。主要设计目标之一是紧凑表示,这使其非常适合基于磁盘的文件格式,但可能不适合存储在内存中以供定序器程序快速访问。 (当读取或写入文件时,可以很容易地将其快速转换为快速访问的格式。)它不打算替代任何程序的常规文件格式,但是如果需要,可以将其用于此目的。 MIDI文件包含一个或多个MIDI流,以及每个事件的时间信息。支持歌曲,音序和音轨结构,速度和拍号信息。音轨名称和其他

林深藏却云门寺 2919

风光储并网对电力系统稳定性影响的仿真研究

本文研究了风光储并网对电力系统稳定性的影响,基于MATLAB/Simulink平台搭建了IEEE 9节点测试系统的风光储并网模型。研究对比了光储、风储和风光储三种并网配置在多种干扰下的稳定性表现。结果表明:光储系统对频率变化最敏感,风储系统具有更强的功率波动适应能力,而风光储联合系统通过互补效应展现出最佳综合稳定性。储能系统在所有配置中均显著改善了频率恢复性能,验证了其在新能源并网中的关键支撑作用。研究为高比例可再生能源电力系统的稳定运行提供了仿真依据和技术参考。

huanghm88的专栏 154

data后缀文件解码_midi文件格式及解码代码

standardmidifileformatwww.EC66.comdustincaldwellthestandardmidifileformatisaverystrangebeast.whenviewedasawhole,itcanbequiteoverwhelming.ofcourse,nomatterhowyoulookatit,...

weixin_32008105的博客 426

【华为OD技术面试手撕真题】1、长度最小的子数组 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(三种解法)

【华为OD面试手撕真题】长度最小的子数组,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 1万+

华为MetaERP PTP采购到应付全流程解析

摘要:本文系统解析华为MetaERP中的PTP(采购到应付)全流程管理方案,涵盖从采购申请到付款执行的完整业务流程。文章详细分解了PR、PO、GR、IV、AP等关键环节的财务核算规则,并提供了预算校验、库存更新等Python代码示例。同时阐述了IT落地架构设计,包括会计引擎配置、系统集成方案及银企直连支付接口实现。该方案通过三单匹配自动化和智能会计引擎,将处理效率提升10倍(200笔/人天→2000笔/人天),实现98%的自动化率,为集团企业提供了高效的数字化财务管理样板。文中所有技术方案均需根据实际场景调

金牌架构师 1743

【多媒体文件格式】MIDI、SMF、IMY、XMF、MMF、SMAF、RTTTL

它是一种用于捆绑音乐为向导的树结构数字容器格式,由单个或多个文件组成,如标准MIDI文件、WAV文件、可下载声音(DLS)乐器文件或数字音频文件等。SMF格式采用了一种简单但有效的方式来存储MIDI音乐数据,将每个音符的信息按照时间顺序排列,并以事件流(Event Stream)的形式保存。SMF格式(Standard MIDI File)是一种标准的MIDI文件格式,用于保存MIDI音乐数据,可以在不同的MIDI设备和软件之间共享和使用。现在电脑的声卡都是与MIDI兼容的,并能逼真地模拟乐器的声音。

多媒体开发者 4266

军品研制过程-转阶段

介绍军品转阶段评审

Abel的博客 2万+

MIDI文件结构分析及生成方法

转自:http://www.fbsky.com/InfoView/Article_40678.html 从网上找的,已经将用BC写的改成了VC的,对于程序中转换是否有问题我也不得而知,反正用VC生成的MIDI文件听起来惨不忍睹。   对于制作MIDI音乐来说,比播放MIDI文件本身更复杂得多。我们得了解一些乐理常识和MIDI文件结构。一、MIDI文件结构分析   MIDI文件包

dayun的专栏 1168

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

下一篇: 会话初始协议(SIP)(1)
Jagen在路上
博客等级 码龄25年 148粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值