「学习笔记」谁都能理解的和弦讲座

总述

和弦类型

  • 三和弦
    • C:大三和弦
    • Cm:小三和弦
    • Cdim:减三和弦
    • Caug:增三和弦
  • 七和弦
    • ?7 表示 7 音和根音差 2 个半音,?maj7 表示 7 音和根音差 1 个半音
    • C7:属七和弦
      • 因为 G7 中 G->C 是强进行,而 BDF 是三全音,所以 G7->C 是非常强的进行,所以叫属七和弦
    • Cmaj7:

和弦作用

  • 主和弦:稳定
  • 下属和弦:相对稳定
  • 属和弦:不稳定
  • 主 - 下属 - 主 - 下属 - 属 - 主 - 属

属音

  • 属音:与根音主和弦(C 大调中的 CEG)仅差一个半音的音
    • 使得和弦不稳定,有向主和弦转变的倾向
    • 如 G 和弦中的 B(转向 C),Bdim 和弦中的 B 和 F(转向 E)

音阶类型

  • C D E F G A B:自然大调
  • A B C D E F G:自然小调
  • A B C D E F G#:和声小调
    • 解决了 A 无导音,E7 缺少三全音的问题
  • A B C D E F# G#:旋律小调
    • 解决了 F 和 G# 之间的增音程,听起来比较和谐

强进行

  • 强进行:上行纯四度或下行纯五度
    • 2-5-1 进行
  • 属进行:属七和弦 -> 主和弦
    • G7->C

按章节

Part 5 顺阶七和弦

  • 当根音到七音为 11 个半音(大七度)时,记为 ○maj7 / ○Δ7
  • 当根音到七音为 10 个半音(小七度)时,记为 ○7
  • 简单计数方法:将根音升高一个八度,若七音和“升高八度后的根音”相隔一个半音则为 maj7,否则相隔两个半音为 7
  • 例:
    • G7 属七和弦
    • Cmaj7 大七和弦
    • Dm7 小七和弦
    • CmMaj7 小大七和弦(小大七和弦必定离阶,即有音在黑键上

Part 6 顺阶和弦应用

  • 最初的和弦很大程度上会决定歌曲给人的印象(C:明亮 Am:阴暗 F:飘忽不定)
  • 常见进行:
    • 和弦的组合近乎无限,此处仅举几个比较常见的例子,可以不用全记,从最近听到比较多的开始记也可以
    • 15634125(卡农进行)
    • 6451(阴暗酷炫?)
    • 6415(欧美音乐常见)
    • 4536251(刻在 DNA 里的流行音乐进行)
    • 4566(ZUN 很常用)
    • 2345(抬升情绪)
  • “和弦就像吃饭,菜的吃法是相对比较自由的,但一般没有人先上来就吃甜点;同样地,和弦虽然比较自由,但也有一定的规矩”
  • 同样的和弦进行,其效果也会受到切换时机和速度的影响

Part 7 转位

  • EGC 记为 C/E(C 的第一转位,念作 C on E)
  • 转位可以使和弦变化更稳定,一般地,仅和弦要转位,Bass 不转位取根音

Part 8 转位的应用

  • 为了更加稳定,可以把 Bass 也转位;通过这个方法也可以让 Bass 更跳跃
  • C -> Am 中间可以让 Bass 向下移一个半音,使得衔接更加顺畅(即分割为 C -> Cmaj7/B -> Am -> Am)
    • 在三和弦只有 Bass 改变的情况下,可以记为 C/B

Part 9 和弦的功能

  • 属和弦:G 和弦。
  • 下属和弦:F 和弦。
  • F->G 走向在古典音乐中是不成立的,但在流行音乐 / 爵士音乐中广泛运用(比喻:礼仪)

Part 10 副和弦 / 代理和弦

  • Am 和 Em 与 C 有两个相同的音 -> 主和弦
  • Bm(b5) 和 G -> 属和弦
  • Dm 和 F -> 下属和弦
  • 总结:主 - 下属 - 主 - 下属 - 属 - 主 - 属
  • Em 相对不稳定:Em 和属和弦 G 也有两个相同的音,且该和弦不含 C

Part 11 属进行

  • 强进行:上行纯四度或下行纯五度,如 G->C、C->G。强动机。
  • B 和 F 由于被 C 和 E 吸引,相对不稳定。
  • 三全音(Tritone):六个半音,如 Bm(b5)。不稳定。
  • 在三音阶 / 四音阶里,有三全音的音阶有 Bm(b5)、G7 和 Bm7(b5)。其中解决到 C 动机最强的为 G7,因为 G7->C 满足强进行。
  • 属进行:即 G7->C(上行或下行均可)。

Part 12 小调上的主和弦

  • 与大调一样是,Am 主 - Bm(b5) 下属 - C 主 - Dm 下属 - Em 属 - F 主 - G 属
    • 也可以把 F 当作下属
  • Em7 缺少导音和三全音,可以将整个调系中的 G 升高为 G#,变成和声小调
  • 和声小调存在增音程(F -> G#),为了更和谐可以再将 F 升高为 F#,变成旋律小调
  • 小调常见进行:4736251
  • “基本上是先用自然小调,写到属和弦的部分的时候临时变为和声小调或旋律小调”

Part 13 副属和弦

  • 除 G7 外的属七和弦被认为是副属和弦(即被强行生造的离调和弦),可以由原和弦 -> 原和弦的副属和弦 -> 原和弦上方纯四度的和弦(如 C/Cmaj7 -> C7 -> F/Fmaj7)
    • 为什么转向上方纯四度:本质上是因为借用了 F 大调中的属七和弦 C7,所以 C7 后会倾向于转向 F
    • 特别地,F7 转后接 Bb,会离调,较少用
  • 实例
    • C7:会进行到 Fmaj7(下属和弦),所以有浮游感
    • D7:暗示 251,有积极的感觉
    • E7:Fmaj7 -> E7 会有成熟的感觉,常用于 R&B
    • A7:Dm7 -> Em7 -> Am7 -> A7,A7 听起来有种古典的感觉;这个进行在爵士中很常见
    • B7:Am -> G -> F -> Em -> Dm -> C -> B7 -> E7,《天空之城》主题曲的进行;B7 一般后接 E,接 Em 的情况很少(小调 251)
  • 重属和弦:两个属和弦连续使用,如 D7 -> G7 -> C

Part 14 251 进行

  • Gm7 -> C7 -> Fmaj7(F 大调的 251)被广泛运用于动漫曲 / J-POP
  • 251 分为大调 251 和小调 251,其中
    • 大调 251:○m7 -> ☐7 -> ☆
    • 小调 251:○m7(b5) -> ☐7 -> ☆m
    • 实际上可以混用开头结尾(比较模糊)
  • 也可以用非目前调的 251(临时 251 / 离调 251)

Part 15 乐曲练习

  • 为了让乐曲更丰富,可以连用多个类似功能和音响的和弦(Dm7/G -> G7)
  • C -> C7 -> Fmaj7,可以从终止走向期待
  • Csus4(C+F+G) -> C,丰富终止

Part 16 减和弦

  • 减和弦:Cdim = Cm(b5) 为减和弦,带有三全音,音响复杂
  • 减七和弦:Cdim7 = C+bE+bG+A 为减七和弦,带有两个三全音,音响复杂且十分阴暗、不稳定可能会很影响旋律,使用时请务必注意
  • 半减七和弦:Cm7(b5) = C+bE+bG+bB 为半减七和弦,相对减七和弦更柔和一点
  • 经过减和弦:可以在根音相隔一个全音的和弦进行中插入一个减和弦,使根音半音进行;如 F -> G 可以变为 F -> F#dim -> G
    • 也可以改为减七或半减七
    • F#dim = #F+A+C 其实等价于 D7 = D+#F+A+C 减去根音,所以会有同样的转向 G 的倾向

「学习笔记」混音基础

频率作用

超低频(20~80Hz)

可以使得音乐更松弛,更软,略微增加弹性

低频(80-250Hz)

可以使得音乐更有力度

中低频(250-800Hz)

温暖感提升,但是清晰度也会下降

中频(800-2500Hz)

声音会向前靠,且硬度明显增加

中高频(2500-5000Hz)

略微向前靠(不明显),主要是会有刺激感,过多会刺耳

高频(5000-8000Hz)

声音变脆,穿透力,冰冷感 / 清晰度提升

超高频(8000-12000Hz)

磁性感,呲呲的、后面的声音

空气声(12000Hz 以上)

人声增加通透感,大部分时候没必要

EQ

首先:能衰减就不用提升

EQ 的三种作用:

  1. 修复音色问题
  2. 改变空间远近(远处中低频多)
  3. 美化声音

可以采用频扫的方式作细微调整

压缩器

启动时间

第一临界点:从软变硬的时间

第二临界点:从硬变弹性的时间

释放时间

调为 $\frac {60}{\text{BPM}} \times 2^k$($k \in \Z$),否则会导致律动被打断

偏短可使得声音有力度、中高频更多,偏长可使得声音更自然柔和

压缩比和阈值

一般高压缩比配高阈值,低压缩比配低阈值

高压可使得声音更有力度,低压可使得声音更自然

「学习笔记」Web 开发基础

HTML 入门

<head>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<head>
<meta charset="utf-8" />

<meta name="author" content="Chris Mills" />
<meta
name="description"
content="The MDN Web Docs site
provides information about Open Web technologies
including HTML, CSS, and APIs for both Web sites and
progressive web apps." />

<title>MDN Web Docs</title>

<link rel="icon" href="favicon.ico" type="image/x-icon" />
<link rel="stylesheet" href="my-css-file.css" />
<script src="my-js-file.js" defer></script>
</head>

效果:

效果

其中 <script> 里的 defer 是让浏览器加载完全部的 HTML 后再运行该脚本。

<ol> 和 <ul>

1
2
3
4
5
<ol>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ol>

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<input type="text" placeholder="请输入" />
<input type="password" placeholder="请输入密码" />
<input type="checkbox" />
<input type="submit" value="提交" />
<input type="reset" value="重置" />
<input type="button" value="按钮" />
<input type="file" />
<input type="hidden" />
<input type="image" />
<input type="color" />
<input type="date" />

<button onclick="displayHi()">按钮文字</button>

/*
类型:
* onclick
* onchange
* onload
* onkeydown
* onmouseover
* onmouseout
*/


CSS 入门

清除性模板

1
2
3
4
5
6
7
* {
text-decoration: none;
color: black;
box-sizing: border-box;
margin: 0;
padding: 0;
}

盒模型

标准盒:

替代盒(常用):

1
2
3
* {
box-sizing: border-box;
}

标准盒的 width 等于内容宽度,替代盒的 width 等于内容宽度、边框宽度和 padding 宽度的总和。

定位

  • position: static:默认跟随文档流
  • position: relative:相对于自身位置移动一点点,但是会占位
  • position: absolute:相对最近的非 static 祖先元素定位,不占位
  • position: fixed:相对视窗定位
  • position: sticky:正常显示时为 static,但如果滚动到相对容器的特定位置则变为 fixed(由 top, left, right, bottom 指定)

选择器速查表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
a[attr^="value"] /* 以 value 开头 */
a[attr$="value"] /* 以 value 结尾 */
a[attr*="value"] /* 包含 value */


a:link /* 链接没有被访问过 */
a:visited /* 链接已被访问过 */
a:hover /* 鼠标移动到链接上 */
a:focus /* 鼠标点击链接时 */
a:active /* 链接正在被点击 */

input:required /* 必须填写 */
input:checked /* 选中 */
input:disabled /* 禁用 */

a:first-child /* 第一个 */
a:last-child /* 最后一个 */
a:nth-child(an + b | even | odd) /* 为父元素的第 an + b (n >= 0) 个,奇数个或偶数个儿子 */

a:first-of-type /* 同上,但是只计数 <a> */
a:last-of-type
a:nth-of-type(an + b | even | odd)

p::before /* 前面 */
p::after /* 后面 */
p::first-letter /* 第一个字 */
p::first-line /* 第一行 */

背景

1
2
3
4
5
6
7
8
.a {
background-color: #f0f0f0; /* 背景颜色 */
background-image: url("front.png"), url("bg.png"); /* 背景图片,前面的图片会放在后面的图片上 */
background-repeat: no-repeat | repeat-x | repeat-y | repeat; /* 背景图片重复,默认 repeat */
background-position: left top | 50% 50% | 0 0 | cover | contain; /* 背景图片位置,默认 0 0 */
background-size: 100px 100px | 50% 50% | cover | contain; /* 背景图片大小,默认 auto; cover 按 max(img_width, img_height) 放缩,contain 按 min(img_width, img_height) 放缩 */
background-attachment: scroll | fixed; /* 背景图片是否随滚动,默认 scroll */
}

颜色

1
2
3
4
5
6
7
#f0e1a6
rgb(2 35 125)
rgb(2 35 125 / .6)
hsl(120 100% 50%)
hsl(350 100% 50% / .6)
linear-gradient(90deg, rgb(119 0 255 / 39%), rgb(0 212 255 / 100%)) /* 从左到右,左边是第一个颜色,右边是第二个颜色;90deg 是逆时针旋转 */
linear-gradient(0deg, rgb(119 0 255 / 39%), rgb(0 212 255 / 100%)) /* 从上到下,上边是第一个颜色,下边是第二个颜色 */

媒体查询

1

min-width 和 max-width

用于响应式设计。min-width 属性表示最小宽度,限制 width 必定不小于 min-width

长度单位

  • px
  • em:本元素的 font-size
  • rem<html>font-size
  • vh / vw
    • vmin / vmax
  • %:相对父元素的大小

Javascript 入门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"use strict";


let a = "ab";
let b = {first: "John", last: "Doe", number: 584};
let c = [3, 7, , , 5]; // 中间是 undefined

console.log(b.first); // John
console.log(b["first"]); // John


let a = "string";
a.length // 6
a.constructor // 返回 a 的构造函数


let b = 35.13;
b.toString() // "35.13"
b.toString(2) // "100011.0010001010001111010111000010100011110101110000101"
b.toFixed(4) // "35.1300"
b.toExponential(4) // "3.5130e+1"
b.toPrecision(5) // "35.130"


let a;
console.log(a); // undefined
a = null;
console.log(a); // null


typeof [1, 2, 3, 4] // object
typeof false // boolean



`I am ${name}.`



switch (x) {
case 1:
// do sth
break;
case 2:
// do sth
break;
default:
// do sth
}


for (const x in arr) {
if (x instanceof Number) {
console.log(`${x} is number\n`); // 自动换行
}
}



str.search(/Runoob/i)
str.replace(/Runoob/i, "Google")
/Runoob/i.test(str) // Boolean
/Runoob/i.exec(str) // Array / String



try {
// 可能会出错的代码
throw "出错信息";
} catch (error) {
// 出错时执行的代码
} finally {
// 无论如何都会执行的代码
}

debugger; // 断点

数据类型

  • 数据类型:String, Number, Boolean, Object, Function, Symbol
  • 对象类型:Object, Date, Array
  • 其他:null, undefined

大数精度问题

在 $[-2^{53} + 1, 2^{53} - 1]$ 之间的整数可以精确表示,但过大的整数 / 任意小数难以精确表示。

可以考虑:

  1. parseFloat(res.toFixed(12)),缺点是大数仍然会出错;
  2. 将小数转为整数再除以 $10^k$(如 $0.1 \times 0.2 = 1 \times 2 \div 100$),缺点是大数可溢出;
  3. 转为字符串模拟计算。

bignumber.js,decimal.js,以及 big.js 采用第三种方案。

null 和 undefined

在 JavaScript 中, null 用于对象, undefined 用于变量,属性和方法。

对象只有被定义才有可能为 null,否则为 undefined。

如果我们想测试对象是否存在,在对象还没定义时将会抛出一个错误。

错误的使用方式:

1
if (myObj !== null && typeof myObj !== "undefined") 

正确的方式是我们需要先使用 typeof 来检测对象是否已定义:

1
if (typeof myObj !== "undefined" && myObj !== null) 

显式函数绑定

在 JavaScript 中函数也是对象,对象则有方法,apply 和 call 就是函数对象的方法。这两个方法异常强大,他们允许切换函数执行的上下文环境(context),即 this 绑定的对象。

在下面实例中,当我们使用 person2 作为参数来调用 person1.fullName 方法时, this 将指向 person2, 即便它是 person1 的方法:

1
2
3
4
5
6
7
8
9
10
var person1 = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
var person2 = {
firstName:"John",
lastName: "Doe",
}
person1.fullName.call(person2); // 返回 "John Doe"

json

1
2
let obj = JSON.parse(json);
let json = JSON.stringify(obj);

javascript:void(0)

void(func) 会使用 js 计算 func,但返回的值固定为 undefined

1
2
<a href="javascript:void(0)">死链接</a>
<a href="javascript:void(alert('hi!'))">点了就会和你打招呼的链接</a>

arguments

相当于 python 里的 args。

1
2
3
4
5
6
function sumAll() {
var i, sum = 0;
for (i = 0; i < arguments.length; i++)
sum += arguments[i];
return sum;
}

正则表达式入门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
\d{4} // 4 个数字
a{3,5} // 3 到 5 个 a

(first)-\1, (second)-\2 // \1 表示第一个括号匹配的内容,\2 表示第二个括号匹配的内容
(?:first), (second)-\1 // (?:) 表示不捕获,\1 实际上是 second

(c|r)at|dog

^string // 以 string 开头
string$ // 以 string 结尾

\w // 匹配字母、数字、下划线
\d // 匹配数字
\s // 匹配空白字符

[0-9]{1,2}(?=PM) // 后面必须带 PM,但 PM 不会被匹配进来
[0-9]{1,2}(?!PM) // 后面不能带 PM
(?<=\$)\d+ // 前面必须带 $
(?<!\$)\d+ // 前面不能带 $

/ ... /g // 表示可以多次匹配
/ ... /m // 表示多行匹配
/ ... /i // 表示忽略大小写

// 贪心匹配:默认尽可能多地匹配

.*? // 非贪心匹配
.*?r

\w+@[a-z|0-9]+\.[a-z]+

Promise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const a = new Promise((resolve, reject) => {
if (true) {
resolve("success");
} else {
reject("fail");
}
});

a.then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
}).finally(() => {
console.log("finished");
});

const b = new Promise((resolve, reject) => {
resolve(a);
})

注意:resolve, reject 不会暂停该 Promise 的运行,例如若 resolve(a); console.log("hi"); 则根本不会等待 a 变为 fulfilled 就直接输出 hi

闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const pack = (() => {
let val = 0;
let setVal;
let getVal;

setVal = (newVal) => {
val = newVal;
return {setVal: setVal, getVal: getVal};
};
getVal = () => val;
return {setVal: setVal, getVal: getVal};
})()

pack.setVal(7);
console.log(pack.getVal());

1
2
3
4
5
6
7
8
9
10
11
12
class ClassName {
constructor(...) { ... }
method1() { ... }
static method2() { ... }
}

class Dog extends Animal {
constructor(...) {
super(...);
...
}
};

apply, call 和 bind

  • call:正常传参
  • apply:传入参数数组
  • bind:返回一个新函数,可以生成回调函数
1
2
3
4
5
func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2]);

const newFunc = func.bind(obj);
newFunc();

DOM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let element = document.getElementById("id");
let elements = document.getElementsByTagName("p");
// elements 为 HTMLCollection 对象,严格来说不是数组,没有 valueOf(), pop() 等
let myNodeList = document.querySelectorAll("p");

element.style.color = "red";
element.addEventListener("click", () => { alert("hi!"); });
element.addEventListener("click", () => { alert("hi!"); }, false); // useCapture, default = false
element.removeEventListener("click", () => { alert("hi!"); });


parent.appendChild(child);
parent.insertBefore(node, referenceNode);
parent.replaceChild(newNode, oldNode);
parent.removeChild(child); // or child.parentNode.removeChild(child);

事件冒泡和事件捕获

冒泡:里面先触发。可以看作从里往外,气泡不断向上级冒出的过程。

捕获:外面先触发。可以看作从外往里捕捉的过程。

展开和解构语法

1
2
[...a]              // 展开
[x, y] = [y, x + y] // 解构

迭代器和生成器

function* func(...) { ... } 来创建一个生成器,在生成器里写 yield valueyield* [value1, value2, ...] 可以卡住生成器并暂时返回该值。

let it = func(...) 来创建一个迭代器(**注意没有 new**),it.next().valueit.next().done 判断是否结束。

也可以直接使用 for-in 循环、[...it] 等语法展开。

也可以在 Person[Symbol.iterator] = function* () { ... } 里定义迭代器,使得该 object 支持迭代。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
let iterationCount = 0;
for (let i = start; i < end; i += step) {
iterationCount++;
yield i;
}
return iterationCount;
}

let it = makeRangeIterator(1, 10, 2); // 注意没有 new!

let result = it.next();
while (!result.done) {
console.log(result.value); // 1 3 5 7 9
result = it.next();
}

console.log(`已迭代序列的大小:${result.value}`); // 5

高级应用:带参数的 next()

yield value 也有返回值,会返回 it.next(arg) 中的参数 arg(可选)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function* fibonacci() {
let current = 0;
let next = 1;
while (true) {
const reset = yield current;
[current, next] = [next, next + current];
if (reset) {
current = 0;
next = 1;
}
}
}

const sequence = fibonacci();
console.log(sequence.next().value); // 0
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2
console.log(sequence.next().value); // 3
console.log(sequence.next().value); // 5
console.log(sequence.next().value); // 8
console.log(sequence.next(true).value); // 0
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 1
console.log(sequence.next().value); // 2

模块

1
2
export { name as newName, func, func2 };
export name from "./sub.js";
1
2
3
import { newName, draw as newDraw, reportPerimeter } from "./module.js";
import * as Module from "./module.js";
// Module.draw()

在 HTML 中:

1
<script type="module" src="main.js"></script>

动态加载

import(path) 返回一个 Promise 对象,其 resolve 的返回值为 Module 本身,可以用 then 来处理 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
squareBtn.addEventListener("click", () => {
import("/js-examples/modules/dynamic-module-imports/modules/square.js").then(
(Module) => {
let square1 = new Module.Square(
myCanvas.ctx,
myCanvas.listId,
50,
50,
100,
"blue",
);
square1.draw();
square1.reportArea();
square1.reportPerimeter();
},
);
});

Prototype

一些细项

  • id = setInterval(fn, delay, ...args), clearInterval(id)

基本数据类型

Number

  • Number.parseInt
  • Number.parseFloat

String

  • String.fromCharCode / String.charCodeAt

  • String.match

  • String.indexOf / String.lastIndexOf

  • String.toUpperCase / String.toLowerCase

  • String.split

  • String.substring(begin, end) (等价于特殊判断的 String[begin:end]

    • begin > end 时会交换,当 begin < 0 时会取 0,当 end > len 时会取 len
  • Array.slice(begin, end)(可取负值)