Skip to content

Commit

Permalink
Split high_tang from mid_tang
Browse files Browse the repository at this point in the history
  • Loading branch information
untunt committed Dec 9, 2024
1 parent 1886e51 commit 6e1d5dc
Show file tree
Hide file tree
Showing 4 changed files with 240 additions and 119 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ https://nk2028-1305783649.file.myqcloud.com/tshet-uinh-examples/<filename>

**推導後世音系 extrapolated phonological system of later periods**

- 推導盛中唐擬音 (Extrapolated Reconstruction of High and Middle Tang Chinese): `mid_tang.js`
- 推導北宋擬音(聲音唱和圖) (Extrapolated Reconstruction of Northern Song Chinese (*Shing-im Chiang-xhua Dhu*)): `n_song.js`
- 推導盛唐(平水韻)擬音 (Extrapolated Reconstruction of High Tang Chinese (*Pingshui Yun*)): `high_tang.js`
- 推導中唐(韻圖)擬音 (Extrapolated Reconstruction of Middle Tang Chinese (*Yuntu*)): `mid_tang.js`
- 推導北宋(聲音唱和圖)擬音 (Extrapolated Reconstruction of Northern Song Chinese (*Shengyin Changhe Tu*)): `n_song.js`
- 推導《蒙古字韻》 (Extrapolated _Menggu Ziyun_): `mongol.js`
- 推導《中原音韻》擬音 (Extrapolated Reconstruction of _Zhongyuan Yinyun_): `zhongyuan.js`

Expand Down
175 changes: 175 additions & 0 deletions high_tang.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
/* 推導盛唐(平水韻)擬音
*
* 盛唐通用語沒有直接描述音系的材料,但有詩韻(「平水韻」)和日語漢音作爲緊密相關的材料
*
* 來源:「平水韻」擬音
* https://phesoca.com/aws/351/ 或
* https://www.bilibili.com/read/cv37390491/ 或
* https://zhuanlan.zhihu.com/p/681190661
*
* @author unt
*/

/** @type { 音韻地位['屬於'] } */
const is = (...x) => 音韻地位.屬於(...x);
/** @type { 音韻地位['判斷'] } */
const when = (...x) => 音韻地位.判斷(...x);

const 非組字典 = {
'f': { : 'f', : 'fʰ', : 'v', : 'ɱ' },
'pf': { : 'pf', : 'pfʰ', : 'bv', : 'ɱ' },
};

function get選單(音類列表, 音標列表s, 音類音標連接符 = ' ', 音類連接符 = ' | ') {
return 音標列表s.map(音標列表 => ({
value: 音標列表.join(','),
text: 音標列表.map((音標, i) => 音類列表[i] + 音類音標連接符 + 音標).join(音類連接符),
}));
}

if (!音韻地位) return [
'聲',
['非組', [1, ...Object.keys(非組字典)]],
[`等類記法
j 代表聲母腭化、ɣ 代表聲母軟腭化,不是介音;
非組和莊章組後總是不寫等類記號`, [1, ...get選單(
['三A', '三BC', '一二四'],
[['j', 'ɣ', ''], ['ʲ', 'ˠ', '']],
' C',
)]],
['見組非三等簡寫作軟腭音', false],

'韻',
['低元音', [2, ...get選單(['前', '後'], [['æ', 'a'], ['æ', 'ɑ'], ['a', 'ɑ']])]],
['後高元音\n微韻開口總爲 ɨj,不受本選項影響', [1, ...get選單(['閉音節', '魚韻'], [['ɨ', 'ɨ'], ['ə', 'ɨ'], ['ə', 'ɯ']])]],
['支脂合併', false],
['咍泰合併', false],
['覃談合併', true],
['東一冬合併', false],
['輕脣東鍾合併', false],
['部分蟹攝二等入假攝', false],
['部分流攝脣音入遇攝', false],

'調',
['聲調', [2, '五度符號', '附加符號', '調類數字']],
['全濁上歸去', false],
];

function 調整音韻地位() {
function 調整(表達式, 調整屬性, 字頭串 = null) {
if (typeof (字頭串) === 'string' && !字頭串.includes(字頭)) return;
if (is(表達式)) 音韻地位 = 音韻地位.調整(調整屬性);
}

// 輕唇化例外
調整('明母 尤韻', { : '一', : null, : '侯' });
調整('明母 東韻', { : '一', : null });

// [慧琳反切體現的, 唐代用韻體現的, 據今音推測的]
const 蟹攝二等入假攝字 = ['崖咼(呙)扠涯搋派差絓畫(画)罣罷(罢)', '佳鼃娃解釵(钗)卦柴', '哇洼蛙灑蝸話(话)掛挂查叉杈衩'].join('');
const 流攝脣音入遇攝字 = ['浮戊母罦罘蜉矛茂覆懋拇某負(负)阜', '謀(谋)部畝(亩)畮婦(妇)不否桴富牟缶', '復複(复)副牡'].join('');
if (選項.部分蟹攝二等入假攝) 調整('蟹攝 二等', { : '麻' }, 蟹攝二等入假攝字);
if (選項.部分流攝脣音入遇攝) 調整('幫組 尤侯韻', { : is`尤韻` ? '虞' : '模' }, 流攝脣音入遇攝字);
}

調整音韻地位();

function get聲母() {
let 等類記法 = 選項.等類記法.split(',');
let 聲母 = when([
['幫組 C類', 非組字典[選項.非組][音韻地位.]],
[!選項.見組非三等簡寫作軟腭音 && '見溪疑曉匣母 非 三等', {
: 'q', : 'qʰ', : 'ɴ', : 'χ', : 'ʁ',
}[音韻地位.]],
['', {
: 'p', : 'pʰ', : 'b', : 'm',
: 't', : 'tʰ', : 'd', : 'n', : 'l',
: 'ʈ', : 'ʈʰ', : 'ɖ', : 'ɳ',
: 'ts', : 'tsʰ', : 'dz', : 's', : 'z',
: 'tʂ', : 'tʂʰ', : 'dʐ', : 'ʂ', : 'ʐ',
: 'tɕ', : 'tɕʰ', : 'dʑ', : 'ɕ', : 'ʑ', : 'ɲ', : 'j',
: 'k', : 'kʰ', : 'ɡ', : 'ŋ',
: 'ʔ', : 'x', : 'ɣ', : '',
}[音韻地位.]],
]) + when([
['幫組 C類', ''],
['莊章組 或 日以母', ''],
['三等 (A類 或 精組)', 等類記法[0]],
['三等', 等類記法[1]],
['', 等類記法[2]],
]);
聲母 = 聲母.replace(/ʰ([ʲˠ])/, '$1ʰ');
聲母 = 聲母.replace(/^ˠ/, 'ɰ');
return 聲母;
}

function get介音() {
return is`合口` ? 'w' : '';
}

function get韻基() {
let 韻基 = when([
[選項.支脂合併 === true && '脂之韻', 'i'],
[選項.咍泰合併 === true && '灰咍韻', 'ɑj'], // 不含廢韻
['脂之韻', 'ij'], ['微韻', [['開口', 'ɨj'], ['', 'uj']]],
['齊祭韻', 'ej'], ['灰咍廢韻', 'əj'],
['佳皆夬韻', 'æj'], ['泰韻', 'ɑj'],

['支佳韻', 'i'], ['魚韻', 'ɨ'], ['虞模韻', 'u'],
['麻韻', 'æ'], ['歌韻', 'ɑ'],

['尤侯幽韻', 'ɨw'],
['蕭宵韻', 'ew'],
['肴韻', 'æw'], ['豪韻', 'ɑw'],

['真臻韻', 'in'], ['殷韻', 'ɨn'], ['文韻', 'un'],
['先仙韻', 'en'], ['元魂痕韻', 'ən'],
['刪山韻', 'æn'], ['寒韻', 'ɑn'],

['侵韻', 'im'],
['鹽添韻', 'em'], ['嚴凡韻', 'əm'], [選項.覃談合併 === false && '覃韻', 'əm'],
['咸銜韻', 'æm'], ['覃談韻', 'ɑm'],

[選項.東一冬合併 === true && '冬韻', 'ɨwŋ'],
[選項.輕脣東鍾合併 === true && '通攝 幫組 C類', 'uŋ'],
['蒸登韻', 'ɨŋ'], ['東韻', 'ɨwŋ'], ['冬鍾韻', 'uŋ'],
['青韻', 'eŋ'],
['庚耕清韻', 'æŋ'], ['陽唐韻', 'ɑŋ'], ['江韻', 'æwŋ'],
]);
韻基 = 韻基.replace(/ɨ(?=$|[^j])/, 選項.後高元音.split(',')[+is`魚韻`]);
韻基 = 韻基.replace('æ', 選項.低元音.split(',')[0]);
韻基 = 韻基.replace('ɑ', 選項.低元音.split(',')[1]);
if (is`入聲`) [...'mnŋɴ'].forEach((v, i) => { 韻基 = 韻基.replace(v, 'ptkq'[i]); });
return 韻基;
}

function get聲調() {
const is陰 = is`全清 或 次清 或 次濁 上入聲`;
return {
五度符號: is陰 ?
{ : '˦˨', : '˦˥', : '˧˨˦', : '˦' } :
{ : '˨˩', : '˨˦', : '˨˨˦', : '˨' },
附加符號: { : '̀', : '́', : '̌', : '' },
調類數字: { : '¹', : '²', : '³', : '⁴' },
}[選項.聲調][選項.全濁上歸去 && is`全濁 上聲` ? '去' : 音韻地位.];
}

function get音節() {
const 音節 = {
聲母: get聲母(),
介音: get介音(),
韻基: get韻基(),
聲調: get聲調(),
};
if (音節.韻基[0] === 'i') 音節.聲母 = 音節.聲母.replace(/(?<!^)j/, '');
if (音節.介音 === 'w') 音節.聲母 = 音節.聲母.replace('ɰ', '');
if (音節.韻基[0] === 'u') 音節.介音 = 音節.介音.replace('w', '');
音節.韻母 = 音節.介音 + 音節.韻基;
音節.帶調韻基 = 選項.聲調 === '附加符號' ?
音節.韻基[0] + 音節.聲調 + 音節.韻基.slice(1) :
音節.韻基 + 音節.聲調;
return 音節;
}

const 音節 = get音節();
return 音節.聲母 + 音節.介音 + 音節.帶調韻基;
Loading

0 comments on commit 6e1d5dc

Please sign in to comment.