乐理备忘录

和弦

1
2
3
4
5
6
7
8
9
10
11
12
13
大七和弦:	大小大	1 3 5 7 2 4 6	4 6 1 3 5 7 2
小七和弦:	小大小	6 1 3 5 7 2 4
小七大九和弦:	小大小	6 1 3 5 7 2 4	自然大调VI级
小七小九和弦:	小大小	3 5 7 2 4 6 1	自然大调III级
属七和弦:	大小小	5 7 2 4 6 1 3
属七降九和弦:	大小小	5 7 2 4b6 1 3	和声小调V级
属七升九和弦:	大小小	5 7 2 4#6 1 3	7音到9音=增三度=纯四度
属七alt和弦:	大小小	5 7 2 4		#5或b13、b5或#11、#9、b9,旋律小调VII级
半减七和弦:	小小大	7 2 4 6 1 3 5	自然大调VII级
减七和弦(Co7):	小小小	7 2 4b6 1 3 5	和声小调VII级
增三和弦:	大大	1 3#5		旋律小调3级
Csus2:			1 2 5		
Csus4(Csus):		1 4 5

调式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
自然大调:	全全半全全全半,1 2 3 4 5 6 7 1
和声大调:	全全半全半三半,1 2 3 4 5b6 7 1
旋律大调:	全全半全半全全,1 2 3 4 5b6b7 1
自然小调:	全半全全半全全,6 7 1 2 3 4 5 6
和声小调:	全半全全半三半,6 7 1 2 3 4#5 6
旋律小调:	全半全全全全半,6 7 1 2 3#4#5 6
Ionian:		全全半全全全半,1 2 3 4 5 6 7 1,自然大调
Dorian:		全半全全全半全,2 3 4 5 6 7 1 2
Phrygian:	半全全全半全全,3 4 5 6 7 1 2 3
Lydian:		全全全半全全半,4 5 6 7 1 2 3 4
Mixolydian:	全全半全全半全,5 6 7 1 2 3 4 5
Aeolian:	全半全全半全全,6 7 1 2 3 4 5 6,自然小调
Locrian:	半全全半全全全,7 1 2 3 4 5 6 7
alter音阶:	半全半全全全全,1b2b3 3b5b6b7 1

自然大调4152637

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 C:	 C  D  E  F  G  A  B  C
#C:	#C #D #E #F #G #A #B #C
bD:	bD bE  F bG bA bB  C bD
 D:	 D  E #F  G  A  B #C  D
bE:	bE  F  G bA bB  C  D bE
 E:	 E #F #G  A  B #C #D  E
 F:	 F  G  A bB  C  D  E  F
#F:	#F #G #A  B #C #D #E #F
bG:	bG bA bB bC bD bE  F bG
 G:	 G  A  B  C  D  E #F  G
bA:	bA bB  C bD bE  F  G bA
 A:	 A  B #C  D  E #F #G  A
bB:	bB  C  D bE  F  G  A bB
 B:	 B #C #D  E #F #G #A  B

自然小调

1
2
3
4
5
6
7
 A:	 A  B  C  D  E  F  G  A
 B:	 B #C  D  E #F  G  A  B
 C:	 C  D bE  F  G bA bB  C
 D:	 D  E  F  G  A bB  C  D
 E:	 E #F  G  A  B  C  D  E
 F:	 F  G bA bB  C bD bE  F
 G:	 G  A bB  C  D bE  F  G

refer to:
https://weibo.com/p/1001603900313475143262

音乐中的英文单词

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
属七升九和弦: dominant seventh sharp ninth chord
bD: D flat
调: key
纯五度: perfect 5th
半音音阶: chromatic scale
自然音阶: diatonic scale
经过音: passing tone
辅助音: neighboring tone/auxiliary tone/upper to lower
全音音阶: whole tone scale 
五声音阶: pentatonic scale
旋律小调: melodic minor
和声小调: harmonic minor
旋律音程: melodic interval
和声音程: harmonic interval
等音程: enharmonic interval
大三和弦: major triad
七和弦: seventh chord
第一转位: first inversion
 
二三四五六七九十度: 英语序数词
八度: octave
三全音: tri-tone
协和: consonant
不协和: dissonant
转调: modulation
移调: transposition
 
二全音符: breve
全音符: semibreve
二分音符: minim
四分音符: crotchet
八分音符: quaver
十六分音符: semiquaver
三十二分音符: demisemiquaver
六十四分音符: hemidemisemi quaver
 
二拍: duple meters(2/2, 2/4, 2/8)
三拍: triple meters(3/2, 3/4, 3/8)
四拍: quadruple meters(4/2, 4/4, 4/8)
五拍: quintuple meters
普通拍子: common meters
复二拍: compound duple meters(6/2, 6/4, 6/8)
复三拍: compound triple meters(9/4, 9/8)
复四拍: compound quadruple meters(12/4, 12/8, 12/16)
混合拍: irregular meters(7/4, 11/7)
 
二连音: duplet
三连音: triplet
四连音: quadruplet
五连音: quintuplet
六连音: sextuplet
本连音: septuplet
 
主音: tonic
上主音: supertonic
中音: mediant
下属音: subdominant
属音: dominant
下中音: submediant/super-dominant
导音: leading tone/subtonic
 
伊奥尼亚调式: ionian
多利亚调式: dorian
弗里及亚调式: phrygian
利底亚调式: lydian
混合利底亚调式: mixolydian
爱奥利亚调式: aeolian
洛克利亚调式: locrian
 
连音: legato
断音: staccato
持音: sostenuto
震音: trembolo
滑音: glissando
切分音: syncopation
先现音: anticipation
延现音: suspension
装饰音: ornament
颤音: trill
波音: mordent
逆波音: inverted mordent/lower mordent/schneller
复波音: double mordent
回音: inverted turn
琶音: arpeggio
模进: sequence
旋律模进: melodic sequence
和声模进: harmonic sequence
旋律进行: melodic progression
旋律轮廓: melodic contour
 
完全终止: perfect cadence
不完全终止: imperfect cadence
半终止: half cadence
正格终止: authentic cadence
变格终止: plagal cadence
阻碍终止: interrupted cadence
伪终止: deceptive cadence
 
三段式: temary form/ABA
变奏曲式: variation form/A, A1, A2, A3
分节歌: strophic form/a, a, a, ...
回旋曲式: rondo form/ABACA
奏鸣曲式: sonata form
 
前奏: prelude
间奏: interlude
尾声: coda
三声中部: trio
华彩乐段: cadanza
改编(缩编): reduction
 
独奏: solo
二重奏: duet
三重奏: trio
四重奏: quartet
五重奏: quintet
合奏: ensemble
 
受难曲: passion
交响曲: symphony
协奏曲: concerto
奏鸣曲: sonata
小奏鸣曲: sonatina
练习曲: etude
进行曲: march
序曲: overture
叙事曲: ballata
间奏曲: inter mezzo
随想曲: capriccio
幻想曲: fantasia
摇篮曲: lullaby
安魂曲: reguiem
小夜曲: serenade
夜曲: nocturn
狂想曲: rhapsody
小步舞曲: minuet
创意曲: invention
谐谑曲: scherzo
布鲁斯: blues
 
宣叙调: recitative
咏叹调: aria
 
管弦乐队: orchestra
指挥: conductor
指挥台: podium
长笛: flute
单簧管: charinet
小号: trumpet
短号: cornet
长号: trombone
大号: tuba
小提琴: violin
中提琴: viola
大提琴: cello
竖琴: harp
键盘乐器: clavier
木琴: xylophone
萨克斯管: saxophone
打击乐: percussion
手风琴: accordion
风琴: organ
 
女高音: soprano
女中音: mezzo soprano
男高音: tenor
男中音: bariton
 
文艺复兴: Renaissance
巴洛克: Baroque
洛可可: Rococo
复调: polyphony

refer to:
http://blog.sina.com.cn/s/blog_d2b7cd6a0102wts1.html
https://wenku.baidu.com/view/bbaca6e981c758f5f61f6779.html

C标准库中的strtok

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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
int main()
{
	char str[1000] = "Steven Jobs, Bruce Lee, Jack Chen, George W Bush";
	char* pNames[100];
	int idxNames = 0;
	char* pWords[100];
	int idxWords = 0;
	char* buf = str;
	char* outPtr = NULL;
	char* innerPtr = NULL;
	while (NULL != (buf = strtok_s(buf, ",", &outPtr)))
	{
		pNames[idxNames++] = _strdup(buf);
		while (NULL != (buf = strtok_s(buf, " ", &innerPtr)))
		{
			pWords[idxWords++] = buf;
			buf = NULL;
		}
	}
 
	return 0;
}

Windows驱动从设备名获取dos盘符路径

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
77
NTSTATUS querySymbolicLink(PUNICODE_STRING symbolicLinkName, PUNICODE_STRING linkTarget)
{
	OBJECT_ATTRIBUTES oa;
	NTSTATUS status;
	HANDLE handle;
 
	InitializeObjectAttributes(&oa, symbolicLinkName, OBJ_CASE_INSENSITIVE, 0, 0);
	status = ZwOpenSymbolicLinkObject(&handle, GENERIC_READ, &oa);
	if (!NT_SUCCESS(status))
		return status;
 
	linkTarget->MaximumLength = 200 * sizeof(WCHAR);
	linkTarget->Length = 0;
	linkTarget->Buffer = ExAllocatePool(PagedPool, linkTarget->MaximumLength);
	if (!linkTarget->Buffer)
	{
		ZwClose(handle);
		return STATUS_INSUFFICIENT_RESOURCES;
	}
	RtlZeroMemory(linkTarget->Buffer, linkTarget->MaximumLength);
 
	status = ZwQuerySymbolicLinkObject(handle, linkTarget, NULL);
	ZwClose(handle);
 
	if (!NT_SUCCESS(status))
	{
		ExFreePool(linkTarget->Buffer);
	}
	return status;
}
 
WCHAR *rtlVolumeDeviceToDosName(WCHAR *deviceName)
{
	NTSTATUS status;
	UNICODE_STRING driveLetterName;
	WCHAR driveLetterNameBuf[128];
	WCHAR c;
	WCHAR driLetter[3];
	UNICODE_STRING linkTarget;
 
	for (c = L'A'; c <= L'Z'; c++)
	{
		RtlInitEmptyUnicodeString(&driveLetterName, driveLetterNameBuf, sizeof(driveLetterNameBuf));
		RtlAppendUnicodeToString(&driveLetterName, L"\\??\\");
		driLetter[0] = c;
		driLetter[1] = L':';
		driLetter[2] = 0;
		RtlAppendUnicodeToString(&driveLetterName, driLetter);
 
		status = querySymbolicLink(&driveLetterName, &linkTarget);
		if (!NT_SUCCESS(status))
			continue;
 
		if (_wcsnicmp(linkTarget.Buffer, deviceName, linkTarget.Length) == 0)
		{
			deviceName += linkTarget.Length - 2;
			deviceName[0] = c;
			deviceName[1] = L":";
			ExFreePool(linkTarget.Buffer);
			break;
		}
		ExFreePool(linkTarget.Buffer);
	}
	return deviceName;
}
 
WCHAR *getDosPath(WCHAR *path)
{
	WCHAR device[] = L"\\Device\\";
 
	if (strIsStartWith(path, device))
	{
		path = rtlVolumeDeviceToDosName(path);
	}
 
	return path;
}

获取HANDLE对应的文件路径

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <Windows.h>
#include <psapi.h>
#include <wchar.h>
 
WCHAR *getFilePathByHandle(HANDLE hFile, WCHAR* filePath, int filePathLen)
{
	DWORD dwFileSizeHi = 0;
	DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);
	HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileSizeLo, NULL);
 
	filePath[0] = 0;
	if (NULL != hFileMap)
	{
		void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
		if (NULL != pMem)
		{
			if (0 == GetMappedFileNameW(GetCurrentProcess(), pMem, filePath, filePathLen))
			{
				// GetLastError
			}
			UnmapViewOfFile(pMem);
		}
		CloseHandle(hFileMap);
	}
	return filePath;
}
 
wchar_t toLower(wchar_t ch)
{
	if ('A' <= ch && ch <= 'Z')
		ch = ch - 'A' + 'a';
	return ch;
}
 
int isNoCaseBeginWith(wchar_t* l, wchar_t* r)
{
	if (*l == 0 && *r == 0)
		return 1;
	if (*l == 0 || *r == 0)
		return 0;
	for (; 0 != *l && 0 != *r; l++, r++)
	{
		if (toLower(*l) != toLower(*r))
			return 0;
	}
	return 1;
}
 
WCHAR* getDosFilePath(WCHAR *dosPath, int len, WCHAR* kernelPath)
{
	wchar_t path[3] = L"C:";
	wchar_t szBuf[MAX_PATH] = { 0 };
	for (wchar_t ch = L'A'; ch <= L'Z'; ch++)
	{
		path[0] = ch;
		QueryDosDevice(path, szBuf, MAX_PATH);
		if (isNoCaseBeginWith(kernelPath, szBuf))
		{
			swprintf_s(dosPath, len, L"%s%s", path, kernelPath + wcslen(szBuf));
			return dosPath;
		}
	}
	dosPath[0] = 0;
	return dosPath;
}
 
int main()
{
	HANDLE hFile = CreateFileW(L"d:\\test.txt",
		GENERIC_READ,
		FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
		NULL,
		OPEN_EXISTING,
		0x00,
		NULL);
 
	if (INVALID_HANDLE_VALUE == hFile)
	{
		return 0;
	}
 
	WCHAR path[1024];
	getFilePathByHandle(hFile, path, 1024);
 
	WCHAR dosPath[1024];
	getDosFilePath(dosPath, 1024, path);
 
	CloseHandle(hFile);
 
	return 0;
}

南北朝年表

五胡十六国

1
2
3
4
5
6
7
8
9
10
11
后赵/328-352/
	石勒/明帝/
	石虎/武帝/
冉魏/350-352/
	冉闵/平帝/
前秦/351-394/
	苻坚/宣昭帝/
后秦/384-417/
	姚苌/昭武帝/330-393
后燕/384-407/
	慕容垂/武帝/

北朝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
北魏/386-534/
	拓跋珪/道武帝/371-409/
	拓跋嗣/明元帝/392-423/
	拓跋焘/太武帝/408-452/灭佛,崔浩(381-450)
	元宏/孝文帝/467-499/494年迁都
东魏/534-550/
西魏/535-556/
北齐/550-577/
	高欢/神武帝/496-547
	高澄/文襄帝/521-549
	高洋/文宣帝/529-559
	高殷/闵悼王/545-561
	高演/孝昭帝/535-561
	高湛/武成帝/537-568
	高纬/556-577
	高延宗/
	高恒/570-577
	高绍义
北周/557-581/

南朝

1
2
3
4
5
6
7
8
9
10
刘宋/420-479/
	刘裕/武帝/
	刘义隆/文帝/
萧齐/479-502/
	萧道成/高帝/
萧梁/502-557/
	萧衍/武帝/
南陈/557-589/
	陈霸先/武帝/
	陈叔宝/后主/

refer to:
http://www.360doc.com/content/18/1206/17/38656042_799787806.shtml
https://baike.baidu.com/item/%E5%8C%97%E9%AD%8F/914008?fr=aladdin
https://baike.baidu.com/item/%E5%8C%97%E9%BD%90/913858?fr=aladdin

自定义printf输出格式

glibc版,代码可参考

1
2
3
//libstrongswan/utils/printf_hook/printf_hook_glibc.c
register_printf_specifier
register_printf_function

要注意的是,由于gcc在编译时不认识自定义格式,默认会提示warning。
禁止此提示的方法是在gcc命令参数中加入

1
-Wno-format

vstr from http://www.and.org/vstr/
代码可参考

1
2
//libstrongswan/utils/printf_hook/printf_hook_vstr.c
vstr_fmt_add

在win32下,libstrongswan自已写了一个printf,代码在位置在

1
2
//libstrongswan/utils/printf_hook/printf_hook_builtin.c
builtin_vsnprintf