计算机音乐创作准备

音乐编创,总的来说有两大形式,即继承和创新。

继承主要指在原作基础之上的改编、借鉴与发展,如保留原曲旋律重新填词,或对结构稍加改编,或选取某些名曲的主题或动机作为素材进行重新构建、重新编曲。创新则指对新内容、新形式和新技法的追求与探索。[1] 比如说原曲填词和重新编曲就属于继承。但有句话说的好,你在听肖邦的时候不仅仅是在听肖邦,而是在听肖邦贝多芬巴赫这一系列作家。每个人的身上都包含了前人的特点和当下现实的特点。这也是为什么我们说艺术源于生活又高于生活。

你对自己能创作出佳作的自信是成功的一半。但是笔者假设如果看到这篇文字的你势单力薄,没有人可以帮助你记录,那么你还需要一些乐理知识来自己动手记谱,不论是简谱还是五线谱。掌握了乐理知识,你将理解前人的音乐文献,并准确地记录自己的旋律,让其他看到乐谱的人理解。基本乐理知识包括读谱、记谱和一些技巧规范等。相关的内容可以看书自学。

 

  • 笔者正在使用的教材:

1.《音乐编创》

2.《视唱练耳》

3.《音乐基础理论》(都是人民音乐出版社的高中教材)

通过第三本系统地学乐谱和各类五线谱上的音乐知识。用第二本学习如何打磨自己的耳朵。用第一本学习编创音乐的方法和技巧。音乐学最基础的就是视唱,练耳。做到看到谱子就能唱,听到声音就知道是什么音。

据说音乐神仙莫扎特第一次创作钢琴曲的时候是他父亲帮他记的谱,很有意思。他不需要知道作曲方法,只是看别人弹的多了自己也便知道该怎么弹了。同理,乐理不能一下子完全掌握并没有关系,我们关心的只是音乐,乐谱只是一种指示的手段,乐谱最终指向的也是音乐本身。

 

  • 听觉训练:
  1. Ear Master(练耳大师:免费下载但可收费升级,练耳也练唱,啥都有)
  2. EarBeater - Free Ear Training Exercises and Music Theory App(这个有 IOS 版的和网页版的,全免费)

 

本来应当遵循循序渐进的原则,坚持不断练习的。但如果看到这里你的热情快要被消耗殆尽了,那我们还是快开始写谱子吧。

 

我需要啥设备?

土豪发烧友:大厂最好的 MIDI 键盘架起来!(一个性能良好的 Musical Instrument Digital Interface 键盘能加快乐谱录入的速度,据说也能增加创作时的灵感,但编曲过程并不是说必须要有 MIDI 键盘)

即兴发烧友:一套计算机键盘和一只鼠标(或触控板等指点设备)。

 

我需要啥软件?

[可选] DAW (Digital Audio Workstation 数字音频工作站):又被称为宿主软件,因为它的主要作用是调协各音源,插件之间的关系,像机架一样把虚拟的功放,胆机等设备管理好。这种软件根据你想创作的乐曲类型来选择。做电音的可能想用 FL Studio(又名水果编曲)、Ableton Live、…… 做人声的可能会用 Cubase…… 做各种音乐的用 Studio One…… 等等很多。到了这个领域就是各家独大的时候了,专业软件都不便宜,而每家都有不同的优点和缺点。所幸有的软件有专门的免费精简版,注册账号后就可以使用,像 Cubase Element(元素版)、Studio One Prime 等。但说实在话,大部分功能都被删减了(但还能用不是)…… 因此也有人推荐入门软件应该是不收费但功能却挺强的 Cakewalk 或是支持 60 天无限制的免费试用,并且用户可以在试用期之后继续使用的 Reaper。【具体的软件选择和功能差异烦请另行探索】

笔者个人觉得 Studio One Prime 比较适合入门,因为免费的中文官方正版送的几十 GB 音源效果器等能减少很多麻烦。而 Reaper 则像我的世界游戏那样,体积小创造性高,但事事都要亲历亲为,一进去空空的英文界面可能会吓退不少人。

[可选] 绘谱软件,又称打谱软件。在这个方面名声响亮的就是 Sibelius 西贝柳斯 了,这是公认的优秀代表,同公司的 DAW 软件 Pro Tools 也有很多人用。上面的音乐教科书中也有简单教授使用 Sibelius 的内容。主要是软件提供了构思(示例灵感片段),方便的合弦、鼓组生成的辅助插件等一些特性。Sibelius 在官网有免费的版本下载但笔者未使用过那个版本。

另外还有一个完全免费的后起之秀叫 MuseScore,体积不大但基本功能都有,也能写吉他谱等各种乐谱,有良好的中文教程和社区交流平台,也是可以使用插件或自己编写插件的,但目前该软件似乎还没有较好的 VST 插件支持。图 1 是 MuseScore 软件截图。

计算机音乐创作准备_第1张图片

图 1. 使用插件在 MuseScore 中创建一段随机音乐

 

[计算机键盘选手] 因为是使用计算机键盘,因此需要一些东西把你的计算机键盘变成一个虚拟的 MIDI 键盘。在这方面笔者使用的是 Virtual Midi Controller 3 LE。(以下简称 VMC,官方网站)这是收费的 Virtual Midi Controller 的一个精简版。均可在作者的软件官网下载得到。使用这个软件前麻烦仔细阅读软件说明书,软件中的 CC 控制器挺强的。在图 2 左上方可以看到这时是使用了微软 GS 波表合成器(一个软音源,如果没有也没有关系,打谱软件和某些 DAW 里都会有软音源)发声。

计算机音乐创作准备_第2张图片

图 2. Virtual Midi Controller 3 LE

 

另外如果需要使用 DAW 的话可能还需要使用一个叫 “LoopMIDI” 的软件来创建一个虚拟的 MIDI 端口(如图 3)(官方网站: http://www.tobias-erichsen.de/software.html),到时在 DAW 软件里选择这个 loopmidi 的虚拟端口就可以了。

计算机音乐创作准备_第3张图片

图 3. 在 LoopMIDI 中新建一个端口

 

新建完端口之后记得还要重开 VMC,然后在 VMC 的左上方调整 MIDI 输出信号到 LoopMIDI 的端口去(如图 4)。

计算机音乐创作准备_第4张图片

图 4. 选取 loopMIDI 端口作为输出端口

 

可以看到 VMC 本身是自带了一个虚拟输出端口的(在软件安装时选择附加安装),但是不知道为什么有些 DAW 中可以使用这个虚拟端口而有些却不能,故如果这个自带的端口不能使用的话就使用 loopMIDI 吧。这里顺便给出一个计算机内的信号流向图(图 5)和以 Studio One Prime 为例的输入信号设置(图 6、图 7)。

图 5. 从计算机键盘到输出音乐

计算机音乐创作准备_第5张图片

图 6. Studio One Prime 里新建一个 “新建键盘” 并设置接收自 loopMIDI Port

计算机音乐创作准备_第6张图片

图 7. 在乐器界面右上方选择该 “新建键盘” 并激活使用

计算机音乐创作准备_第7张图片

图 8. 使用”Tab” 激活 Studio One 中的电脑 MIDI 键盘

 

另外有些安卓手机在开发者模式里有个以 MIDI 设备的方式连接电脑,配合相应的手机软件连上也可以当作 MIDI 键盘用。

需要说明的是有些 DAW 中在 MIDI 键盘选择时本身是自带了可以使用键盘作为输入的选项的,比如水果编曲,Ableton Live(仅使用中间一排按键),Studio One(添加了 Qwerty Keyboard 后按 Tab 激活键盘)等,但笔者还是觉得这个 VMC 好用,因为可以设置 hook 全局按键,高级版甚至可以自定义每个按键。但是其实最终的最终,使用计算机键盘还是比不上 MIDI 键盘,因为 MIDI 键盘可以捕捉按键的力度(key pressure, aftertouch),很方便地移调(pitch),调整颤音(使用 mod 调制轮自定义)。

 

这软件我有了,但我不会用它这咋整啊?

几乎所有大厂的软件都会有软件使用演示 demo 和帮助文档的,不论是网页版的或是可下载的帮助文档(大部分是英文的)。

 

我去哪里看音乐文献啊?音乐文献看的云里雾里的咋办?

普通的音乐文献网上哪都有。专业的音乐文献一般可以是在 IMSLP 国际乐谱数据库这里找到,但流行音乐 IMSLP 是没有的。

下面这篇文章详细介绍了 IMSLP 和使用方法

林斯特:推荐 | 最方便最权威的音乐图书馆 IMSLP​

zhuanlan.zhihu.com计算机音乐创作准备_第8张图片

这篇文章介绍的是如何探索古典音乐的

LBM 国际艺术教育:搜索古典音乐的小技巧​

zhuanlan.zhihu.com

 

掌握一般的乐理知识就能看懂大部分乐谱的基本部分。但各种记号可能不太容易记住。如果你对某个音乐文献实在存在疑惑而身边又没有人能帮助你,那么可以试试使用 PhotoScore 这个软件。这个软件原本是 Selibus 的附加软件,但可以单独安装使用的。它可以通过扫描图片和 pdf 格式的标准乐谱甚至是手写的乐谱来重新生成五线谱和表情符号,识别率很高(作家自创的记号和中文不能识别)。你可以把该软件生成的五线谱放到打谱软件中进行播放,听听曲子实际的音响效果。但切忌对这种软件产生依赖。毕竟自己的内心听觉是要通过不断锻炼来加强的。

 

必要的优秀软音源?

软音源经过许多年的发展,已经有了很大变化。最初的软音源是电子合成波形,像 GS 波表合成器就是一个。后来由于这种声音缺乏真实感,便有人直接找乐手录制真实的乐器声音,把每个音阶录下来保存,计算机播放曲谱时就直接调用这些相应的录音。结果各种音源的出现大大增强了计算机音乐的真实感,开辟了计算机音乐应用的新天地。现在网络上软音源免费的也有很多,它们大多是个人做出来之后共享上传的,以.dll 格式来保存和调用的就是电子合成波形。另外收费的软音源也有倍受大众好评的 Pianoteq(体积小但质量不错,钢琴是卖点但还有竖琴钟鼓等,有 stage、standard、pro 版,图 9 是 stage 版)、SWAN 系列(小体积的管弦乐,有各种提琴铜管等)、KORG(合成器等)和 Kontakt(音源管理合成器)。注意优秀的音源一般收费不便宜。

特别说明这个 Kontakt 本身只是一个音源管理器(又叫采样器),自带一些音效处理,需要导入软音源库或手动设计音源。因此专业的音乐人不仅是要购买 Kontakt,还要购买适量的软音源才行。

这里有一个旧版的 KONTAKT 5 原厂音色包 :

在 pan. 百度.com/s/13LLB5rpGb8BvhdakE4weqg 使用 l9il 提取

 

计算机音乐创作准备_第9张图片

图 9. Pianoteq 可以在桌面独立运行并使用自带的键盘

 

 

使用 MIDI SDK 进行个性化功能开发!

在使用 MIDI 设备时,可能会碰到没有符合自己期望的控制功能或这个功能的实现要用到另一个设备造成繁琐操作的问题。而依靠设备厂商不如自己动手丰衣足食,用计算机代码写出自己所需的功能。

笔者找到了两个 SDK,分别是 Bome Software 的 BMIDI(官网有 whitepaper 指南、 rtMIDI 代码库)和 Tobias Erichsen 的 teVirtualMIDI-SDK (1.3.0.43)。Tobias Erichsen 是 loopMIDI 工具的作者,这个 SDK 可以在他的官网上找到。

在怎样用 MIDI 做出好听的逼真的弦乐?- 知乎 中 @蒿旭东 提到通过鼠标的 x 轴和 y 轴坐标来同时控制两个 MIDICC 通道,因为觉得挺有趣的,笔者便模仿做了一个实现示例,应该是适配所有正常矩形屏幕的,用到的是 teVirtualMIDI-SDK。演示视频和 C 语言代码如下。后期各位也可以自己实现加速度捕捉等其它功能,进行个性化的开发。遵守作者的许可证协议,这里不共享软件。

 

利用鼠标来同时控制两个 MIDI CC

以下代码在 Visual Studio 2017 (v141) 平台上编译通过(记得链接动态库),WindowsSDK 版本 10.0.17763.0,使用 Unicode 字符集。

/* teVirtualMIDI C interface
 *
 * Copyright 2009-2019, Tobias Erichsen
 * All rights reserved, unauthorized usage & distribution is prohibited.
 *
 *
 * File: teVirtualMIDITest.c
 *
 * This file contains a sample using the TeVirtualMIDI-dll-interface, which
 * implements a simple loopback-MIDI-port.
 */

#include 
#include 
#include "windows.h"
#include "time.h"
#include "teVirtualMIDI.h"

#define MAX_SYSEX_BUFFER	65535


char *binToStr(const unsigned char *data, DWORD length) {
	static char dumpBuffer[MAX_SYSEX_BUFFER * 3];
	DWORD index = 0;

	while (length--) {
		sprintf_s(dumpBuffer + index, 65535, "%02x", *data);
		if (length) {
			strcat_s(dumpBuffer, ":");
		}
		index += 3;
		data++;
	}
	return dumpBuffer;
}

void CALLBACK teVMCallback(LPVM_MIDI_PORT midiPort, LPBYTE midiDataBytes, DWORD length, DWORD_PTR dwCallbackInstance) {
	if ((NULL == midiDataBytes) || (0 == length)) {
		printf("empty command - driver was probably shut down!\n");
		return;
	}
	if (!virtualMIDISendData(midiPort, midiDataBytes, length)) {
		printf("error sending data: %d\n" + GetLastError());
		return;
	}
	printf("command: %s\n", binToStr(midiDataBytes, length));
}


void sendMidiData(const LPVM_MIDI_PORT &port, const LPBYTE &mouseMsg)
{
	//start to send MIDI data
	if (!virtualMIDISendData(port, mouseMsg, 3))//here I set 3 bytes
	{
		printf("fail reason:%d\n", GetLastError());
	}
	printf("send command: %s\n", binToStr(mouseMsg, 3));
}

int main(int argc, const char *argv[]) {

	LPVM_MIDI_PORT port;

	printf("teVirtualMIDI C loopback sample\n");
	printf("using dll-version:    %ws\n", virtualMIDIGetVersion(NULL, NULL, NULL, NULL));
	printf("using driver-version: %ws\n", virtualMIDIGetDriverVersion(NULL, NULL, NULL, NULL));

	virtualMIDILogging(TE_VM_LOGGING_MISC | TE_VM_LOGGING_RX | TE_VM_LOGGING_TX);

	port = virtualMIDICreatePortEx2(L"C loop back", teVMCallback, 0, MAX_SYSEX_BUFFER, TE_VM_FLAGS_PARSE_RX);
	if (!port) {
		printf("could not create port: %d\n", GetLastError());
		return NULL;
	}

	printf("Virtual port created - press enter to continue\n");
	_getch();

	unsigned short channelX, channelY;
	printf("Set Your X Axis CCchannel(e.g: 48):");
	scanf_s("%hd", &channelX);
	printf("Set Your Y Axis CCchannel(e.g: 49):");
	scanf_s("%hd", &channelY);
	channelX > 127 ? channelX = 127 : 1;//keep channelX value between 0 and 127(0x7f)
	channelX < 0 ? channelX = 0 : 1;
	channelY > 127 ? channelY = 127 : 1;
	channelY < 0 ? channelY = 0 : 1;

	/*send Mouse MIDI data*/
	//int x=0, y=0;
	POINT p;// 定义一个 POINT 变量,用于存储鼠标的坐标
	GetCursorPos(&p);// 获取鼠标位置

	int nScreenWidth, nScreenHeight;
	nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
	nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
	printf("\t当前屏幕的分辨率为:\t%d×%d\n", nScreenWidth, nScreenHeight);

	int xPostion = abs(p.x / (nScreenWidth / 127));
	int yPostion = abs(p.y / (nScreenHeight / 127));
	printf("\t有效控制范围是:\t%d×%d\n\n", (nScreenWidth / 127) * 127, (nScreenHeight / 127) * 127);
	LPBYTE mouseXMsg;
	LPBYTE mouseYMsg;
	char mouseccx[] = { 0xb0, channelX, xPostion };
	char mouseccy[] = { 0xb0, channelY, yPostion };
	int length = sizeof(mouseccx) / sizeof(mouseccx[0]);
	mouseXMsg = (LPBYTE)malloc(length + 1);
	memcpy(mouseXMsg, mouseccx, length);
	mouseYMsg = (LPBYTE)malloc(length + 1);
	memcpy(mouseYMsg, mouseccy, length);

	char formalXPostion = 0, formalYPostion = 0;

	printf("当前的鼠标坐标为:x:% d,y:% d\n", p.x, p.y);
	while (true){
		Sleep(50);//set capture interval
		GetCursorPos(&p);// 获取鼠标位置

		xPostion = abs(p.x / (nScreenWidth / 127));
		yPostion = abs(p.y / (nScreenHeight / 127));
		xPostion > 127 ? yPostion = 127 : 1;//keep xPostion value between 0 and 127(0x7f)
		xPostion < 0 ? xPostion = 0 : 1;
		yPostion > 127 ? yPostion = 127 : 1;
		yPostion < 0 ? yPostion = 0 : 1;
		if (formalXPostion != xPostion)
		{
			formalXPostion = xPostion;
			mouseXMsg[2] = xPostion;
			sendMidiData(port, mouseXMsg);
		}
		if (formalYPostion != yPostion)
		{
			formalYPostion = yPostion;
			mouseYMsg[2] = yPostion;
			sendMidiData(port, mouseYMsg);
		}
	}

	virtualMIDIClosePort(port);
	printf("Virtual port closed - press enter to terminate application\n");
	_getch();
}

 

谢谢大家!

 

参考资料:

[1] 赵季平,莫蕴慧。音乐编创:必修。北京:人民音乐出版社. 2019.7. P4

[2] C Binding Sample of Tobias Erichsen in teVirtualMIDI-SDK

你可能感兴趣的:(音乐制作,midi音乐,计算机音乐,c语言,其他,经验分享)