Finally, after years, I have moved to somewhere where I actually have access to a karaoke with a Japanese system in close proximity. I was really excited to learn that there is a Round1 that I can go to without traveling to somewhere ridiculously far. This Round1 advertises that it is equipped with the DAM […]
The post DAM Karaoke in Round1 Tukwila from the View of a Vocaloid Enjoyer appeared first on 1A23 Blog.
]]>Finally, after years, I have moved to somewhere where I actually have access to a karaoke with a Japanese system in close proximity. I was really excited to learn that there is a Round1 that I can go to without traveling to somewhere ridiculously far.
This Round1 advertises that it is equipped with the DAM karaoke system, but without many details. I decided to give it a try and see if it could offer the entire set of features of an actual karaoke box in Japan. (Although frankly, I’d actually prefer JoySound over DAM for the better Vocaloid song coverage if I ever have a choice.)
First of all, the pricing. Round1 Southcenter offers two different systems at the same price, an English machine using Healsonic’s system, and a Japanese one using DAM. Both systems are available in the same room and share the same price.
Day | Time | 1–3 people | 4–6 people | 7–15 people | 16–30 people |
---|---|---|---|---|---|
Monday–Thursday | Open–16:00 | $12 | $17 | $31 | $50 |
16:00–Close | $16 | $22 | $44 | $70 | |
Friday | Open–16:00 | $12 | $17 | $31 | $50 |
16:00–Close | $24 | $29 | $51 | $82 | |
Saturday | Open–16:00 | $14 | $19 | $32 | $53 |
16:00–Close | $24 | $29 | $51 | $82 | |
Sunday & Holiday | Open–12:00 | $14 | $19 | $32 | $53 |
12:00–19:00 | $24 | $29 | $52 | $82 | |
19:00–Close | $16 | $22 | $44 | $72 |
I chose to visit on a weekday morning for the cheapest rate, and all karaoke rooms were free as expected. The booking process was simple. No prior reservation was required. I just went to the counter, told the person that I wanted to book a Japanese karaoke room, made the payment, and handed over my photo ID. Then she gave me a tray with the DAM remote, two microphones, and an instruction pamphlet.
Unfortunately, the instruction pamphlet wasn’t really helpful in trying to set up the machine. The instructions seemed to be missing a critical step. Switching the input on the mixer was easy with the instructions, but me and the staff spent almost ten minutes trying to figure out why the TV didn’t show anything from the DAM machine.
It turns out that the Healsonic box has to be turned off first to let DAM output reach the TV, which was rather confusing. The staff might not have been trained on how to use that either. At least it’s good that they extended my booking for 10 more minutes to compensate for the setup time.
Taking a closer look at the machine and remote, the machine is a DAM-XG5000, released in 2010, and the remote is a PM300zB, which seems to be from the same era.
The remote is seemingly also rather old, only communicating with the karaoke machine through infrared. It has a rather old database, and there are visually zero Vocaloid songs available just by searching on the remote, which is quite disappointing. However, there is an option to request a song by its number in the database, allowing me to bypass the search function on the remote.
It turned out that the actual machine has a much newer database than the remote. By searching on DAM’s website, and making requests by song numbers, I managed to get songs as new as Blue Planet / DECO*27 (2023) to play on the machine. That means the machine itself is actually being updated or connected to the internet although the remote isn’t.
Despite the number request method unlocks many more songs than what’s stored on the remote, it did not work for every single song I requested. Specifically, songs that came with a dedicated video (e.g. songs labeled with 本人映像, アニメ特撮映像, LIVE 本人歌唱) will give errors when requested. Presumably, these songs carry features not supported by the machine. That means other popular songs from the same year like Kyōfū All-Back / Yukopi (2023) can’t be requested on the machine. Only songs that use local stock footage as background would work as expected.
Besides quite a few featured songs being unavailable, the machine is also not set up with the DAM machine in mind. The microphones are only connected to the mixer but not to the DAM machine, rendering the pitch rating feature on the machine unusable. Additionally, being a model from 2010, it doesn’t support song requests over the internet as it lacks the feature to generate a QR code for the connection.
After all, even though it lacks all sorts of stuff mentioned above, this Round1 is still the best option of commercially available karaoke box around the region that offers a decent range of Vocaloid songs. It’s arguably the next best option compared to an in-house DIY karaoke with online videos or the JoySound app on some gaming consoles, and I think I’d definitely visit there again during the end-of-year holidays.
Search keywords: Round1 Tukwila, Westfield Southcenter, Renton, Seattle, Washington, USA.
The post DAM Karaoke in Round1 Tukwila from the View of a Vocaloid Enjoyer appeared first on 1A23 Blog.
]]>ボカロ曲をちゃんと歌えるカラオケ屋さんを望み続けて数年、最近ようやくそんなところを発見し、行けるようになった。カラオケ屋として経営はしていないけれど、みんなお馴染みのラウンドワンだから、きっと大した差はないだろう。 このラウンドワンは、公式サイトで DAM 機種を利用していると言っていたが、詳しくは書いていない。果たしてすべての機能を使えるかを確かめるため、私は確かめに行くことを決めた。(正直に、もし選べるならボカロ曲収録がより多い JoySound の方がよかった。) 料金 まずは料金設定、ここのラウンドワンは英語向けの Healsonic と日本語向けの DAM の二つのカラオケ機種を用意されていた。同じ部屋に提供されたので、料金は機種に関係なく一緒になっていた。 曜日 時間 1–3 人 4–6 人 7–15 人 16–30 人 月火水木 16:00 まで $12 $17 $31 $50 16:00 から $16 $22 $44 $70 金曜日 16:00 まで $12 $17 $31 $50 16:00 から $24 $29 $51 $82 土曜日 16:00 まで $14 $19 $32 $53 […]
The post ひとりのボカロファンから見る Round1 Tukwila の DAM カラオケ appeared first on 1A23 Blog.
]]>ボカロ曲をちゃんと歌えるカラオケ屋さんを望み続けて数年、最近ようやくそんなところを発見し、行けるようになった。カラオケ屋として経営はしていないけれど、みんなお馴染みのラウンドワンだから、きっと大した差はないだろう。
このラウンドワンは、公式サイトで DAM 機種を利用していると言っていたが、詳しくは書いていない。果たしてすべての機能を使えるかを確かめるため、私は確かめに行くことを決めた。(正直に、もし選べるならボカロ曲収録がより多い JoySound の方がよかった。)
まずは料金設定、ここのラウンドワンは英語向けの Healsonic と日本語向けの DAM の二つのカラオケ機種を用意されていた。同じ部屋に提供されたので、料金は機種に関係なく一緒になっていた。
曜日 | 時間 | 1–3 人 | 4–6 人 | 7–15 人 | 16–30 人 |
---|---|---|---|---|---|
月火水木 | 16:00 まで | $12 | $17 | $31 | $50 |
16:00 から | $16 | $22 | $44 | $70 | |
金曜日 | 16:00 まで | $12 | $17 | $31 | $50 |
16:00 から | $24 | $29 | $51 | $82 | |
土曜日 | 16:00 まで | $14 | $19 | $32 | $53 |
16:00 から | $24 | $29 | $51 | $82 | |
日曜日・休日 | 12:00 まで | $14 | $19 | $32 | $53 |
12:00–19:00 | $24 | $29 | $52 | $82 | |
19:00 から | $16 | $22 | $44 | $72 |
私は一番安い平日の昼に行くことに決めた。チェックインはかなり順調で、全室空いていたので、事前予約も要らなかった。カウンターに行き、日本語のカラオケボックスを使いたい旨を伝え、料金を支払い、身分証明書を渡したら、デンモクとマイク 2 本と使用説明のパンフレットが渡されました。
残念ながら、説明を渡されたにもかかわらず、あまり役に立てなかった。ミキサー入力の切り替えは簡潔に書かれていたが、大事な点を見落としていたようだ。スタッフと一緒に 10 分近くかけて、テレビに DAM の画面がなぜ表示されないのかを調べてた。
結局なところ、英語の方の Healsound をオフにしないと DAM は使えないようだが、なぜかはわからない。少なくともこれにかかった 10 分間を延長してくれたので、個人的には大したことではなかった。
本体とデンモクを詳しく見ると、本体は 2010 発売の DAM-XG5000 で、デンモクはおそらく同時期の PM300zB だ。
デンモクはかなり古くて、赤外線通信しかできない。内蔵のライブラリもそうで、ボカロ曲はまず見つからなくて、最初はすごくがっかりした。しかし、選曲番号で予約することもできるので、内蔵ライブラリにない曲もこれで予約できるのか試してみた。
幸い、本体の方はネットワークに接続しているようで、DAM の公式サイトで見つけた番号で『ブループラネット / DECO*27』(2023) みたいな新しめな曲も予約することができた。
しかし、ネットに接続してるとしても、すべての新曲が予約できるのではなかった。特に、本人映像・アニメ特撮映像・LIVE 本人歌唱とか映像付きの曲は予約するとエラーが出る始末になった。一般的な背景映像が出るような曲だけは普通に予約ができる。おそらくバージョンが古いので、映像すら対応してないだろう。そのため、同じく 2023 年の『強風オールバック / ゆこぴ』は「本人映像」付いたため予約できなかった。
その他にも、この部屋は全体的に DAM に向けてセットアップされてなかった。マイクはミキサーにだけ接続されてて、DAM 本体には接続されてなかった。精密採点機能はオンにできるものの、入力がないため0点しか出せなかった。さらに古いモデルであるため、アプリで予約しようとしても、QR コードが出せないから諦めるしかなかった。
こちらのラウンドワンはいくら欠点があろうとも、この近所で見つけられるカラオケ屋の中でボカロ曲を一番歌える選択だ。おそらく、お家の DIY カラオケとゲーム機搭載の JoySound アプリ以外の一番のチョイスでもあると考える。年末の休暇になったら、正直もう一度行きたい。
検索キーワード: Round1 Tukwila, Westfield Southcenter, Renton レントン, Seattle シアトル, Washington ワシントン州, USA アメリカ.
The post ひとりのボカロファンから見る Round1 Tukwila の DAM カラオケ appeared first on 1A23 Blog.
]]>This is yet another random side project I was working on recently, and my first attempt to reverse engineer a real world application compiled into binary. In this article, I want to talk about how I reversed engineered an Unity IL2CPP binary compiled to NSO, in a step-by-step fashion. Forewords Kotoba no Puzzle: Mojipittan is […]
The post Reverse engineering an IL2CPP NSO binary: Case study of Mojipittan Encore appeared first on 1A23 Blog.
]]>This is yet another random side project I was working on recently, and my first attempt to reverse engineer a real world application compiled into binary. In this article, I want to talk about how I reversed engineered an Unity IL2CPP binary compiled to NSO, in a step-by-step fashion.
Kotoba no Puzzle: Mojipittan is a word puzzle game series in Japanese, where the player makes words from letter pieces on a board. It sort of like Scrabble, but not exactly the same. I always wanted to give it a try, but it was quite an old game, available only on GBA, PSP, DS, and Wii. That’s until they made an Encore version on Nintendo Switch. This game is also one of the reasons I bought a Switch.
Ever since I bought the game, I was wondering if there is a way to solve the game optimally. The first step to approach this is to first get the dictionary of the game. Despite the game has now released to multiple different platforms, there has no resource online on the word list used in the game. I thus decided to do it myself.
To follow this article, you would need an exploitable Nintendo Switch with a purchased copy of Mojipittan Encore and a PC running Windows. Although there are other ways to do it with only a PC, I do not recommended shem for reasons. You might be able to also use other OSes, but a lot of the resources has precompiled binary for Windows, which involves less effort.
To get the game data from the device, you need to dump it from the console. Yuzu has provided a detailed guide on how to dump games and corresponding keys. I will use an XCI dump here as an example.
To extract the dumped XCI file, I used hactool, specifically this wrapped version Unpackv2. Once the tool is downloaded and unzipped, follow the next steps:
prod.keys
extracted form your device to the folder where Unpack.cmd
is found, and rename it to keys.txt
.Unpack.cmd
to start the script.If your patch was inside XCI, press "1" and ENTER
If you don't have a patch, just only press ENTER
Drop here correct NCA patch file (probably the biggest one) from ExtractedXCI folder in
Press ENTER to delete all temporary files
After finishing the export process, there will be a new folder created with the extracted content, with two subfolders: exefs and romfs. We will make use of these contents in the next step.
When you open the romfs/Data folder, you will be welcomed with some familiar file names, like resource.assets, sharedassets0.assets, level0, and level1. Yes, if you have ever made or opened the directory of a Unity game, you will surely recognize these file names. Unity organizes their asset files in a pretty recognizable pattern, and is well studied by the community with multiple tools created.
At this point, you are free to extract all static assets files found in the game, like text files and textures. The tool I used is Unity Asset Bundle Extractor (UABE). To extract assets, open the .assets files with the tool, and export the assets using the built-in plugins to easily processable formats.
Besides the folder mentioned above, there is a subfolder StreamingData/Switch/datas, which contains assets that are loaded after the game has initialized. Here, the files we are interested are the dictionary files under romfs/Data/StreamingData/Switch/datas/dictionary. Open it with UABE, we can see three text assets: worddata.aid, worddata.cot, and worddata.dic. Extract them with the txt export plugin, we can get three binary files with some sort of patterns.
$ xxd worddata.aid | head -n 20
00000000: 5744 5000 0002 1ca1 0000 0001 0001 c1e6 WDP.............
00000010: 0000 0002 0001 ffee 0001 5eb2 0001 5eb3 ..........^...^.
00000020: 0000 0003 0001 ffef 0001 fff0 0000 0004 ................
00000030: 0000 0005 0000 0006 0001 5d48 0000 0007 ..........]H....
00000040: 0000 0008 0000 0009 0000 000a 0000 000b ................
00000050: 0001 92b4 0001 92b7 0001 92b3 0001 92b6 ................
00000060: 0001 92b5 0000 000c 0001 5a5f 0001 fff1 ..........Z_....
00000070: 0000 000d 0000 000e 0000 000f 0000 0010 ................
00000080: 0000 0011 0001 9019 0000 0012 0001 fff2 ................
00000090: 0000 0013 0001 fff3 0000 0014 0000 0015 ................
000000a0: 0000 0016 0000 0017 0000 0018 0000 0019 ................
000000b0: 0000 001a 0000 001b 0000 001c 0000 001d ................
000000c0: 0000 001e 0000 001f 0000 0020 0000 0021 ........... ...!
000000d0: 0000 0022 0000 0023 0000 0024 0000 0025 ..."...#...$...%
000000e0: 0000 0026 0000 0027 0001 fff4 0000 0028 ...&...'.......(
000000f0: 0000 0029 0000 002a 0000 002b 0000 002c ...)...*...+...,
00000100: 0000 002d 0000 002e 0002 1191 0002 1838 ...-...........8
00000110: 0001 5f43 0000 0030 0001 fff6 0000 0031 .._C...0.......1
00000120: 0000 0032 0000 0033 0000 0034 0000 0035 ...2...3...4...5
00000130: 0001 6782 0000 0036 0001 6783 0001 6785 ..g....6..g...g.
The files start with a WDP\0
header (which was not found elsewhere on the internet), and a bunch of 0000
bytes spread across the odd columns, but we can’t really interpret the meaning of these data by just staring the files. We definitely need the help of the code logic of the game.
As it is commonly known, most logic of Unity games are written in C♯. When compiled to DLL files, C♯ code is rather easy to decompile. However, in environments where .NET runtime is hard to prepare, or where performance is critical, Unity offers an option called Intermediate Language to C++ (IL2CPP) that further compiles Microsoft Intermediate Language (MSIL) into C++ and further into native code. This technique is commonly seen on Unity games running on mobile platforms. Nintendo Switch is of no exception.
Nintendo Switch runs on a special binary format called NSO, which is a custom variant of AArch64 ELF binary. To save space, a lot of NSO files are by default compressed. We need to first decompress it with hactool.
hactool --uncompressed=exefs/main_unc exefs/main
With the uncompressed binary, we can then use IL2CPPdumper to extract the offset and signature of each function in the binary.
Il2CppDumper exefs/main romfs/Data/Managed/Metadata/global-metadata.dat il2cppdump
In the new il2cppdump folder, you can find the JSON file script.json and a C++ header file il2cpp.h with all the metadata, which we will use later to locate the function code during the actual decompilation.
Browsing the script.json file, we can find some interesting methods that might help us to decode the dictionary file:
void CDictionary__GetDictionaryData (CDictionary_o* __this, System_String_o** strReading, System_String_o** strNotation, System_String_o** strMeaning, int32_t nWordId, const MethodInfo* method);
int32_t CDictionary___ConvertKey2String (CDictionary_o* __this, System_String_o** strOut, System_UInt32_array* apKey, uint32_t nLongFlag, const MethodInfo* method);
Fortunately, not only the class and method names, even the parameter names are kept, which will help us a lot figuring out the code logic.
To actually decompile the file, we will use Ghidra, an open-source reverse engineering tool that works on multiple platforms. However, Ghidra does not support NSO and IL2CPP binary out of the box, so we need some install something more to help us, namely:
Finally, we can proceed to decompile the binary. To make full use of the metadata we extracted earlier, there are a few steps we need do before starting to read the source code.
When the main_unc bianry is first loaded into a Ghidra project, it will prompt you to start an automatic analysis. Since the binary contains about 47MB worth of data, it might take a considerable amount of time to conduct the analysis, and we are only interested in a small portion of the code. I thus chose to skip the analysis.
The first step is to import the data types defined in the header file into Ghidra. Since the generated il2cpp.h contains some data types that it does not recognize natively, we need to prepend these lines to it.
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
typedef __int8 int8_t;
typedef __int16 int16_t;
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef __int64 size_t;
typedef size_t intptr_t;
typedef size_t uintptr_t;
With the modified header file, we can then return to Ghidra, open File -> Parse C Source… to import it. When the Parse C Source dialog is opened, clear everything in the Source files to parse and Parse options section, then add the header file we prepared. Finally, click Parse to Program to start.
Next, we need to label the functions at their respective offsets. Open the Script Manager from Windows -> Script Manager, search for ghidra.py, then click the green play ⃝▶ button to run the script. When prompted for files, select the script.json file exported from IL2CPPdumper.
Once the script is finished, we will see there will be all the functions imported in the Symbol Tree panel in the sidebar. In the Filter box of at the bottom of the section, we can enter CDictionary to find all the dictionary related method.
Then we can select the CDictionary$$GetDictionaryData
in the Symbol Tree, and Ghidra will direct us to the correct byte offset in the Listing window. If you see a bunch of ??
in the listing, press D on the keyboard to disassemble the function. As it disassembles, some C-like source code will also show up on the right side in the Decompile window.
Inside the window, you may see a lot of types are set as long
, unknown8
, and strange type that might not make sense. A lot of these can be fixed by correcting the function signature and let Ghidra to re-infer the types. To do so, right click the function name and click Edit Function Signature. In the dialog opened, replace the arguments and return type in the large text box with what you can find in the corresponding "signature"
field in the script.json file. Take note that you need to drop the MethodInfo * method
argument (which is always the last argument), as it is not decompiled by Ghidra.
To help improving the readability of the decompiled source, here are some helpful shortcut keys:
With correct types, Ghidra is able to better infer some pointer offsets as struct properties or array indexes, which makes. the decompiled source easier to read.
With all the source disassembled and decompiled, it is sufficient to conduct a static analysis and recover most of the logic to parse the dictionary. However, there are still some portion of the code where the decompiled code does not make sense potentially due to some misassigned types.
int CDictionary$$_ConvertKey2String
(CDictionary_o *__this,System_String_o **strOut,System_UInt32_array *apKey,
uint32_t nLongFlag)
{
undefined8 ex;
CMojiBlock_o *mojiBlock;
System_String_o *result;
int i;
ulong apKey10;
ulong uVar1;
long lVar2;
float *matrix03;
uint apKey0;
uint apKeySize;
if ((DAT_7102d7e960 & 1) == 0) {
__this = (CDictionary_o *)InitializeMethodMetadata(0xc24);
DAT_7102d7e960 = 1;
apKeySize = *(uint *)&apKey->max_length;
}
else {
apKeySize = *(uint *)&apKey->max_length;
}
if (apKeySize == 0) {
ex = IndexOutOfRange_FUN_7100bd84b0(__this);
__this = (CDictionary_o *)throw_FUN_7100bd72c0(ex,0,0);
apKeySize = *(uint *)&apKey->max_length;
apKey0 = apKey->m_Items[0];
}
else {
apKey0 = apKey->m_Items[0];
}
if (apKeySize < 2) {
ex = IndexOutOfRange_FUN_7100bd84b0(__this);
throw_FUN_7100bd72c0(ex,0,0);
}
result = EmptyString;
apKey10 = (ulong)apKey0 & 0x7fffffff;
if (nLongFlag != 0) {
apKey10 = CONCAT44(apKey->m_Items[1],apKey0);
}
i = 0;
uVar1 = (ulong)((uint)apKey10 & 0x7f);
*strOut = EmptyString;
if ((apKey10 & 0x7f) != 0) {
do {
if (((*(byte *)(SingletonMonoBehaviour<GlobalFunc>_TypeInfo + 0x127) >> 1 & 1) != 0) &&
(*(int *)(SingletonMonoBehaviour<GlobalFunc>_TypeInfo + 0xd8) == 0) ) {
ExclusiveMonitor_FUN_7100bb3c20();
}
mojiBlock = (CMojiBlock_o *)
SingletonMonoBehaviour<_CMojiBlock>$$get_Instance
(Method$SingletonMonoBehaviour<GlobalFunc>.get_Instance() );
matrix03 = *(float **)&(mojiBlock->fields).m_MojiMtx.fields.m03;
lVar2 = (long)(int)uVar1 + -1;
if ((uint)matrix03[6] <= (uint)(float)lVar2) {
ex = IndexOutOfRange_FUN_7100bd84b0();
throw_FUN_7100bd72c0(ex,0,0);
}
/* What is this mess trying to get a string from a Unity matrix offset? */
result = System.String$$Concat(result,*(System_String_o **)(matrix03 + lVar2 * 2 + 8) );
uVar1 = apKey10 >> 7 & 0x7f;
apKey10 = apKey10 >> 7;
i = i + 1;
*strOut = result;
} while ((int)uVar1 != 0);
}
return i;
}
Without much clue to untangle this mess, I thought it would be easier to get the game running and attach a debugger to it to actually see how it works. Luckily there’s Yuzu, a Nintendo Switch emulator that comes with GDB stub that can allow us to attach a GDB session to it.
To enable GDB on Yuzu, go to Emulation -> Configure…. In the popup, go to General -> Debug -> Debug, and check Enable GDB Stub. To the right end of the check box is the port number where Yuzu is listening for GDB connections.
Once GDB Stub is enabled, the game will only initialize the essential parts, and pause to wait for us to inspect it, and set up breakpoints before we ask it to continue
.
While Yuzu conveniently provides a way for us to plug GDB into the emulator, not all GDB would work with it. As NSO binaries are essentially AArch64 binaries, we need a GDB that’s compiled to support this architecture to work with it. Fortunately, devKitPro has offered a GDB that’s compatible with AArch64. Once devKitPro is installed, run the following command to install GDB for AArch64:
dkp-pacman -Syu devkitA64-gdb
With this, we are ready start debugging with GDB and Ghidra on Yuzu. In the Ghidra project window, click the 🪲 icon in the toolbar to open the Ghidra debugger.
In the debugger window, look for the Debugger Targets panel to the left, and click the Create a new connection to an (sic.) debugging agent. In the dialog, select IN-VM GNU gdb local debugger, and enter the full absolute path of the previously installed gdb
for AArch64 in the GDB launch command field.
Once finished, there will be a new Interpreter panel shown up to the right, with a (gdb)
prompt at the bottom of the panel. To connect the GDB session to Yuzu, use the following command:
target extended-remote 127.0.0.1:5678
…where 5678
is the port number previously set in Yuzu settings.
If the connection is successful, you can try to inspect the offset of the running game by running monitor get info
. You should get an output similar to this:
monitor get info
Process: 0x51 (main)
Program Id: 0x01006b900f436000
Layout:
Alias: 0x108c600000 - 0x208c600000
Heap: 0x208c600000 - 0x220c600000
Aslr: 0x0008000000 - 0x8000000000
Stack: 0x100c600000 - 0x108c600000
Modules:
0x0008000000 - 0x0008003fff rtld
0x0008004000 - 0x000b091fff main
0x000b092000 - 0x000b7a5fff subsdk0
0x000b7a6000 - 0x000c4a2fff sdk
In the output, we can see a line that says 0x0008004000 - 0x000b091fff main
. This tells you the address range of our binary is mapped in the RAM. In this case, the starting address in the binary 0x710000000
is corresponding to
in the RAM from the debugger.0x0008004000
To let Ghidra to match the RAM data against our disassembled binary, we can first drag the main_unc
item from the Ghidra project window to the debugger, which allows us to see the RAM view and the decompiled listing side by side.
Then, in the Module tab of the right sidebar of the debugger, click the 📄 icon to open the Static Mapping dialog. In the dialog, press the button to create a mapping. In the Add Static Mapping dialog, fill the following fields accordingly:
ram
: <starting address in listing>, <ending address in listing>]ram
: <starting address of the main
module>,<ending address of the main
module>]Click Apply to save.
Now, we have the disassembled and annotated binary mapped against the memory space. We can easily navigate like we did in the CodeBrowser. Functions are listed in the Symbol browser at the same place, and we can navigate back to CDictionary$$GetDictionaryData
from there.
To set a breakpoint, select the instruction from the Dynamic, Listing, or Decompile panel, and press K.
Once all necessary breakpoints are set, we can move back to the Interpreter window, and type continue
to resume the game.
While debugging, some important tools and informations can be found in different panels of the debugger window:
All GDB commands are still available from the Interpreter panel.
To trigger the game to load up from the dictionary with predictable result, the easiest way is to search for a word in the game’s word lookup feature. Once we hit submit, the game is paused for us at the beginning of the GetDictionaryData
method as the first breakpoint hit.
With help of these tools and the memory value at each step, it is much easier to understand the logic of the code, and to untangle those sections that the decompiler did not handle properly.
By inspecting the memory content around the matrix offset, It turns out that that part of the code is actually loading from a list of strings that converts the key into a Hiragana, which happened to follow the Unicode order with a few exceptions.
From there, I was able to fully decode the dictionary files and extract all words with their definitions, which wraps up the project with a success.
I have released the parsing script, and the parsed dictionary data as JSON file to a GitHub repository. There are a lot of binary processing due to the nature of the format, but is in general much more readable. Note that thre are still other data not used in the dictionary files, but since we are only interested in the words and definitions, I think I have achieved the goal.
Trivia As it is obvious from the game’s word lookup feature, the longest word in the dictionary has 9 kana, which means リバース・エンジニアリング (reverse engineering) in the cover picture doesn’t actually exist in the dictionary, although リバース and エンジニアリング do. Also, ユニティー (Unity) isn’t in the dictionary either despite being short enough.
Fun fact In order to save space, Mojipittan Encore uses Shift JIS instead of UTF-8 to store the phrases and definitions, as most characters used take 2 bytes in Shift JIS against 3 in UTF-8. However, this has a problem where some accented letters, like the é in café and cliché, are not encoded in Shift JIS. How the game solves it is to encode these characters as question marks in the dictionary, and hardcoded all the affected words in the game logic when converting them back to UTF-8.
The post Reverse engineering an IL2CPP NSO binary: Case study of Mojipittan Encore appeared first on 1A23 Blog.
]]>Previously, I have introduced how LyricsX handled playback progress of different players, and briefly talked about how I applied its principal to web audio with a requestAnimationFrame() loop. In this article, I’ll talk about how to use WebVTT, a browser-native captioning feature to receive callbacks on specific time ranges. Web Video Text Tracks (WebVTT) is […]
The post Use WebVTT without actually using WebVTT: Another way to monitor playback progress of HTML Media Elements appeared first on 1A23 Blog.
]]>Previously, I have introduced how LyricsX handled playback progress of different players, and briefly talked about how I applied its principal to web audio with a requestAnimationFrame()
loop. In this article, I’ll talk about how to use WebVTT, a browser-native captioning feature to receive callbacks on specific time ranges.
Web Video Text Tracks (WebVTT) is a media captioning feature of HTML5 standard that has support from all major modern browsers. In its typical use cases, author of the webpage can provide a caption file in an SRT-like syntax defined by WebVTT, and link the file to a video element using a <track />
tag. The browser will then be aware of the caption, and provide option to render it on top of the video.
Besides rendering captions, WebVTT also provides a set of API that accepts a callback function when the media element enters a specific time range, which we can make use of to track the playback progress without using the sometimes-not-as-precise timeupdate
event. While WebVTT is designed for video playbacks, the callback features would also work even the track is attached to an <audio />
node.
In WebVTT, each caption line with a specific time range is called a “cue”. To provide callback functions to a cue, the cue has to be inserted to a caption track (also known as a textTrack
) programmatically.
To add a track, it is recommended to create a <track />
node inside the audio/video node. Despite the Multimedia API offers a .addTextTrack()
method, tracks added in this way cannot have an ID, and cannot be removed until the page refreshes due to the lack of a corresponding .removeTextTrack()
method. Therefore, using DOM nodes is safer in terms of controllability.
Below is an example of creating a text track programmatically.
const track = document.createElement("track");
const uniqueId = Math.random().toString(36).substring(2, 15);
track.id = `track-${uniqueId}`;
track.kind = "subtitles";
track.label = `Track #${uniqueId}`;
// Minimum WebVTT track file
track.src = "data:text/vtt;base64,V0VCVlRUCgoK";
const player = document.querySelector("audio");
player.appendChild(track);
// Enable track in order to allow callbacks
track.track.mode = "hidden";
In case you need to remove the track to start over, it is as easy as removing the track element from the dom.
track.parentNode.removeChild(track);
WebVTT tracks provides convenient API to add and remove tracks. When adding a track, it needs 3 parameters, start time and end time in seconds, and the subtitle content. In our use case, the subtitle content is optional, and you can leave it blank, or set it to any content you prefer for debugging purpose.
const cue = new VTTCue(1.5, 2.25, "");
Then, you can add event listeners to the cue object you created. VTTCue
has two events, enter
and exit
. As the name suggest, these events are triggered when the current playback progress enters or exits the cue’s time range. It will trigger in normal playback, and also when user seeks the progress bar.
For use cases where the events are single-ended, i.e. events only has a start time, and ends right before the next starts, it is possible to only set an enter
event listener, and let the enter event of another cue as the exit event of the current one.
cue.addEventListener("enter", () => {
console.log("Entered cue");
});
Last but not least, the cue need to be added to a track to take effect.
track.track.addCue(cue);
Now, when you play the media element with the track attached, you should be able to see the events triggered as it enters the time duration of each cue.
While this WebVTT implementation is more native to the browser and technically offering better performance than listening to timeupdate
and scan through all time ranges every time, the precision of this is still being limited by the browser’s WebVTT implementation itself. On Chrom* browsers, it does not guarantee a perfect sync with the media, which is also observed with ordinary WebVTT subtitles.
If you need a better precision control, and only work with short audio files, Web Audio API might be a better choice.
If you are interested in a full example, and you are comfortable with TypeScript and React, here’s an exmaple where I apply this WebVTT track-based tracking to a custom React hook in Lyricova Jukebox: hooks.ts.
The post Use WebVTT without actually using WebVTT: Another way to monitor playback progress of HTML Media Elements appeared first on 1A23 Blog.
]]>Recently I was working on the release automation at work, and one of the requirements is to gap a specific number of hours between stages, and snap to normal business hours. While having a centralized scheduler won’t be a choice unless I want to flood the run logs, and a pipeline run would mostly be […]
The post Flexible and dynamic flow control of Azure DevOps YAML Pipelines using variables appeared first on 1A23 Blog.
]]>Recently I was working on the release automation at work, and one of the requirements is to gap a specific number of hours between stages, and snap to normal business hours. While having a centralized scheduler won’t be a choice unless I want to flood the run logs, and a pipeline run would mostly be unconfigurable once started due to the constraint of Azure DevOps (AzDO) Pipelines, there are still some trickeries to achieve dynamic flow control within the pipeline. In this article, I’d talk about how I setup the flow control.
Here are the two requirements that we want to address in this article:
Both of them can be achieved on the same YAML Pipeline.
While AzDO YAML pipelines does not come with a true delay-between-stages feature similar to the one in Classic Release Pipelines, inserting a delay within in a YAML pipelines Job is rather simple. AzDO Pipeline comes with a Delay task that can wait for up to 60 days. We’ve tested it on our pipeline that it can wait for at least 72 hours without issue.
There are two things need to be taken care of. One is that the Delay task is an agentless task. If most of your tasks run on an agent, like PowerShell or Bash script, you would need to create a separate agentless job for the Delay task. The other is that AzDO Pipelines by default limit a job/task timeout to be 60 minutes. If you expect it to delay for longer than that, you should update the cancelTimeoutInMinutes
of both the task and the containing job to the maximum duration you’d expect, or simply put 0
to eliminate the limit.
To set a duration dynamically, we can calculate the duration in a job, and set the result with an output variable. In agent tasks, you can set an output variable by printing a logging command to stdout
. You can also invoke the REST API of AzDO Pipelines if you are running a custom agentless task to achieve similar outcome.
Below is an example demonstrating a way to schedule a gap for at least 48 hours, and the gap will always ends on a weekday.
- job: GapScheduler
displayName: Gap scheduler
steps:
- name: Scheduler
powershell: |
$delayDuration = New-TimeSpan -Hours 48
while (
(Get-Date).Add($delayDuration).DayOfWeek -eq 'Saturday' -or
(Get-Date).Add($delayDuration).DayOfWeek -eq 'Sunday'
) {
$delayDuration = $delayDuration.Add(New-TimeSpan -Hours 24)
}
Write-Host "##vso[task.setvariable variable=delayMinutes;isoutput=true]$($delayDuration.TotalMinutes)"
- job: InterStageGap
displayName: Inter-stage gap
dependsOn: GapScheduler
pool: server
cancelTimeoutInMinutes: 5760 # 4 days
steps:
- task: Delay@1
inputs:
delayForMinutes: $[ dependencies.GapScheduler.outputs['Scheduler.delayMinutes'] ]
By cutting off a pipeline branch, I mean that when a certain condition is met, all stages depending on it, both directly and indirectly, should be skipped without leaving an error state. Other stages not on the dependency chain shall not be affected. Also, this shall not affect stages that has their dependency disabled at trigger time. It shall also not affect existing behavior when there are legitimate failures.
To decide if a stage should be ran, the condition should be decided before it starts running, that is, in its dependency stage. The decision can be made in any sort of task that can set an output variable. Since the output would be a boolean-like value, and the only type you can set for a variable is string, you can put whatever value you like as the true/false value, here we will use "true"
and "false"
for simplicity.
To skip a stage based on an output of a previous stage, we need to use the stage condition
property. Apart from the existing default condition, we also need to check if the previous stage has told us to skip.
There could be three kinds of “output” from the previous stage decision, "true"
, "false"
, and null
which could happen if the previous stage is disabled at trigger time. Since we want the stage to run in both the "true"
case and the null
case, we only need to check if the variable is set to "false"
.
The default condition for a stage is succeeded()
, which has covered all existing conditions that can properly handle failure and disabled cases. It is also tested that succeeded()
evaluates to false
when the previous stage is skipped by a condition
expression that was evaluated to false
. In this way, we can safely extend from there with an and()
clause.
Below is an example that skips Stage2
, and subsequently Stage3
on every Monday.
- stage: Stage1
jobs:
# Other jobs go here...
- job: CutOffDecider
displayName: Cut-off decider
steps:
- name: Decider
powershell: |
$decision = "true"
if (Get-Date.DayOfWeek -eq "Monday") {
$decision = "false"
}
Write-Host "##vso[task.setvariable variable=shouldRunNextStage;isoutput=true]$decision"
- stage: Stage2
dependsOn: Stage1
condition: and(succeeded(), ne(dependencies.Stage1.outputs['CutOffDecider.Decider.shouldRunNextStage'], 'false'))
jobs:
# Jobs go here...
- stage: Stage3
dependsOn: Stage2
# Stage 3 is also skipped as a part of the dependency tree when Stage 2 is skipped
jobs:
# Jobs go here...
Dynamic gap and cut-off control together forms two of the building blocks of the foundation of a flexible and dynamic multi-stage release automation system that works on Azure DevOps YAML pipelines.
The post Flexible and dynamic flow control of Azure DevOps YAML Pipelines using variables appeared first on 1A23 Blog.
]]>This project came out from a key highlight of the Luna for CTFd theme, a CTFd theme trying to reproduce the atmosphere of the game Project SEKAI: Colorful Stage feat. Hatsune Miku. In order to recreate the unique and symbolic music selection interface, I went forward to write this piece of code out myself. Below […]
The post Content-aware Infinite Scroll Loop using JavaScript appeared first on 1A23 Blog.
]]>This project came out from a key highlight of the Luna for CTFd theme, a CTFd theme trying to reproduce the atmosphere of the game Project SEKAI: Colorful Stage feat. Hatsune Miku. In order to recreate the unique and symbolic music selection interface, I went forward to write this piece of code out myself.
Below is a simple demo of the final outcome.
Before I started coding, the first thing I did was to look for existing implementations of scroll loops. There are mainly two types of implementation, one is to have the scroll content overflow the container, and programmatically manipulate the scroll position, the other is to append elements dynamically to the end of the scroll content when user scrolling near to the end.
I went with the former strategy because the latter would only allow scrolling in a single direction. However, the former strategy relies on the fact that the list stretching beyond the view size, and has no consideration on the selected item within the list.
Here is a list of features I implemented for the scroll loop list, and I will talk about them one by one in detail afterwards.
Repeating the list items is seemingly the easiest problem to solve here. The only factor we need to determine the number of times we need to repeat each side. Usually this factor is determined by the size of the viewport, and must be updated when the window resizes. However, in this example, we are going to use the screen size as the basis for performance reasons. In this way, we do not need to keep track of the size of window constantly.
Here we assume that the screen size is constant, that means the script cannot handle cases where the window is being dragged to another screen with a larger size, or is rotated 90°. Yet these the size will be recalculated when the user switches to another category, so it is not too much of an issue.
The number of times we need to repeat the list can be found with an easy division:
\left\lceil{\text{height of screen}\over\text{height of an item}\times\text{number of items}}\right\rceil
Hereafter, we will refer to the list at the center as the “center segment” of the list.
This is the most basic requirement to achieve a scroll loop. When the user scrolls to the top or the bottom end of the list, we let the browser jump back to the opposite end to allow the user to continue scrolling. This is done by listening to the scroll
event of the scrolling container and update the scroll offset when necessary.
Below is an animation illustrating the logic.
As illustrated, despite there is a sudden jump in the scroll position, visually the user would feel like the list is kept on scrolling because the content in the viewport remains the same before and after the jump.
The remaining question would be when we jump and how far we jump. I will talk about these case by case.
Design decision: Item selection
The original game has taken an approach to always select the centered item while scrolling. While this approach may eliminate the need of differentiate the jump logic, in my use case, each selection of an item would send an HTTP request to the server. Selecting items while scrolling would unnecessarily increase the load of the server, and the strategy is thus abandoned.
When no items are selected, all of the repeating segments will be fully identical to the center one. In this case, we will use the center of scrolling container as a basis. When the center segment is scrolled pass the basis, we jump the scroll position for a full height of the center segment to ensure that the basis line always overlap with the center segment.
The length of the jump must always be a multiple of the center segment height to ensure that we do not create any visual disruption while manipulating the scroll position.
Once an item is selected, the center segment will have an item highlighted comparing to the repeating segments. With the highlighted row, users would tend to use it as a visual probe when scrolling through the list. This means we can no longer jump through the list bluntly, as for shorter lists the selected item will be jumping around in the middle of the screen, which is less ideal visually.
Instead, we want the select item loop across the screen like the Snake, while still keeping it always within the scroll window whenever possible.
The logic I had for this scenario can be summarized in the pseudo code below:
if the selected item is out of view:
if the same item in the previous or next repeating segment is in the view:
// Jump to the furthest selected item in the view.
jump max(⌈viewHeight ÷ centerHeight⌉, 1) × centerHeight
else:
// The view is in between two selected item
Follow the logic in Scenario 1
The reason of not highlighting the item in every repeating segment is because that the view will be visually too busy when multiple segments are shown in the view. We only want to keep the selected item in the center segment.
Below is an animation illustrating an example of this logic, where ★ signifies the selected item.
With modern browser, smooth scroll to a specified offset is no longer hard, the scrollTo
API offers an option behavior: "smooth"
. Specifying the offset, and the browser will do the transition animation for you. The only one trick we would need do is to ensure that the item clicked is from the center segment for highlighting.
The logic is rather simple, first check if the item clicked is within the center segment. If not, jump the scroll offset by the distance between the clicked item and the corresponding item in the center segment. Finally do a scroll transition.
This transition gives users a positive feedback that the web app has responded to their selection.
Updating the list is in fact mostly outside of the scope of the scroll loop project, expect that the number of repeat times need to be recalculated when the length of filtered items changes.
To achieve this, you can choose whichever framework you like, or even vanilla JavaScript. In the example above, I used Alpine.js which is the front end framework used by the default CTFd theme.
There is one thing you may need to take note when using Alpine.js: clearing selection must be done after populating the filtered list. Otherwise the repeated list might not be updated correctly due to a rendering disruption.
While this solution works for most modern browsers, there is a specific problem with Firefox (Gecko) for Windows. As outlined in their Wiki article about scroll-linked effects, scrolling events in Firefox for Windows are sent asynchronously, and usually comes with a delay. That means the user scroll will sometimes override the value set by JavaScript, causing the screen to jitter as a result.
While the article has proposed various JavaScript API for use cases that need to manipulate the scroll position itself, none of them is implemented at the moment. With this, I had to resort to a suboptimal solution, debounce the scroll position update event calls until the user stops scrolling. While this may make the scroll manipulation seem slow, it is still better than constantly jittering user’s screen during scrolling.
For reference, Firefox for Android, macOS and Linux works just fine as Chrome and Safari do.
While some of the solutions may sound hacky and not perfect across all forms, this is the best I can come up with at the moment. I definitely look forward to more advanced scroll manipulation API being implemented for a simpler and better solution that this.
Feel free to leave a comment if you have any questions or suggestions. Hope you enjoyed this!
The post Content-aware Infinite Scroll Loop using JavaScript appeared first on 1A23 Blog.
]]>ある日、ニコ動で『初音ミクの消失合作』という「消失シリーズ」の考察動画を発見した。相当詳しく解説したので、動画のままじゃいつか無くなったら取り返せないので、文字にすればもっと保存しやすいと思い、セリフ全文を Azure Cognitive Service に投げつけて、戻ってきた文章をひたすら修正しながら、画面にある補足内容も打ってみました。 もちろん、元動画が削除されていない限り、そちらを視聴するのがおすすめです。 凡例 再生された歌詞、画面にある図示や補足は全部引用文にする。補足内容は引用文と囲まれた上で右揃えにする。画面下部の文字をタイトルとして扱う。その他のセリフはすべて地の文にする。 現代ボーカロイド概論 現代ボーカロイド概論 導入篇 ♪sm29312207 – 有機生命体進化論元ネタはラーメンズの「現代片桐概論」また動画としては sm14880242 をリスペクトしている(投コメ記載) ニコニコ大学某 N 高等学校とは無関係である ええ、ご入学おめでとうございます。ええ、諸君らはここ、ニコニコ大学に、競争率 0.25 倍を勝ち抜き、合格されたわけですけれども。ええ、いつまでもコンパ、コンパじゃダメなんだと。しっかり勉強をしてください。 ええ、諸君らが、未だかつて小中高と学んだことのない教科、「現代ボーカロイド概論」であります。ええ、わたくしキボチマス非常勤講師です。へえ、本日はどうもよろしくお願いします。 録画講義の録画とか言っているがそういう形式の方が動画を作りやすかっただけであるあとゆっくりに喋らせるのがめんどくさかった 学問の歴史として非常に浅い↓日々新しい発見がある さて、学問の歴史としては非常に浅く、従って発見と発展の目覚ましい学問といえるのではないでしょうか。そういう理由もありましてね、こちらの講義はなんと、あの後ろのカメラで録画されております。ええ、後でねあのどっかの動画サイト、ニコニコとか、YouTube とかにアップロードされて、のちの学者の参考とか、まあ、学生の卒論の素材とかになるそうです。 初音ミク黎明期 【初音ミク公式イラスト】初音ミククリプトンから発売されている音声合成・DTM用のボーカル音源およびのそのキャラクタである(Wikipedia より引用) 黎明期黎明とは夜明けのことここでは初音ミクの曲がニコニコ動画にアップロードされ始める 2007〜2008 頃を指す ええ。さてさて、講義の方に移ってまいりましょう。まずはボーカロイドの中でも知名度の高い初音ミクのその黎明期について解説をしていきます。今回の講義では、ボカロ概論の根幹をなす「初音ミクの消失」とその考察について話していきたいと思います。 学問の歴史として非常に浅い↓日々新しい発見がある↓最近も大発見があった 【初音ミクの消失 -Real and Repeat- アルバムカバー】新しい資料C94 で発表された消失リメイクCD。詳しい解説は後述 今回の講義では「旧」消失シリーズ【初音ミクの消失アルバムカバー】 それと、もう1つ現代ボーカロイド概論は先ほども言ったように、発見と発展の目覚ましい学問です。ここ一年でですね、まあ、「初音ミクの消失」につきましては新しい曲、新しい資料、たくさん発見されてきました。ですので、今回は「旧」消失シリーズ、まあ、つまりこの2010年に発売されております、初音ミクの消失 CD。こちらの世界観について解説をしていきます。 何故か?【初音ミクの消失 -Real and Repeat- アルバムカバー】2018 年夏コミ「初音ミクの消失 -Real and Repeat-」発売「Novel」ルート、「Fake」ルート、「Real」ルートの存在が示唆され、学会員を大いに悩ませている 学会「ボカロ学系学会」もちろん架空の存在、現段階の学会員は投稿者ひとりのみ なぜかと言いますと、あの言ってしまいます。2018 […]
The post 『初音ミクの消失合作』セリフ文字起こし appeared first on 1A23 Blog.
]]>ある日、ニコ動で『初音ミクの消失合作』という「消失シリーズ」の考察動画を発見した。相当詳しく解説したので、動画のままじゃいつか無くなったら取り返せないので、文字にすればもっと保存しやすいと思い、セリフ全文を Azure Cognitive Service に投げつけて、戻ってきた文章をひたすら修正しながら、画面にある補足内容も打ってみました。
もちろん、元動画が削除されていない限り、そちらを視聴するのがおすすめです。
再生された歌詞、画面にある図示や補足は全部引用文にする。補足内容は引用文と囲まれた上で右揃えにする。画面下部の文字をタイトルとして扱う。その他のセリフはすべて地の文にする。
現代ボーカロイド概論 導入篇
♪sm29312207 – 有機生命体進化論
元ネタはラーメンズの「現代片桐概論」
また動画としては sm14880242 をリスペクトしている(投コメ記載)
ニコニコ大学
某 N 高等学校とは無関係である
ええ、ご入学おめでとうございます。ええ、諸君らはここ、ニコニコ大学に、競争率 0.25 倍を勝ち抜き、合格されたわけですけれども。ええ、いつまでもコンパ、コンパじゃダメなんだと。しっかり勉強をしてください。
ええ、諸君らが、未だかつて小中高と学んだことのない教科、「現代ボーカロイド概論」であります。ええ、わたくしキボチマス非常勤講師です。へえ、本日はどうもよろしくお願いします。
録画
講義の録画とか言っているがそういう形式の方が動画を作りやすかっただけである
あとゆっくりに喋らせるのがめんどくさかった
学問の歴史として非常に浅い
↓
日々新しい発見がある
さて、学問の歴史としては非常に浅く、従って発見と発展の目覚ましい学問といえるのではないでしょうか。そういう理由もありましてね、こちらの講義はなんと、あの後ろのカメラで録画されております。ええ、後でねあのどっかの動画サイト、ニコニコとか、YouTube とかにアップロードされて、のちの学者の参考とか、まあ、学生の卒論の素材とかになるそうです。
【初音ミク公式イラスト】
初音ミク
クリプトンから発売されている音声合成・DTM用のボーカル音源およびのそのキャラクタである
(Wikipedia より引用)
黎明期
黎明とは夜明けのこと
ここでは初音ミクの曲がニコニコ動画にアップロードされ始める 2007〜2008 頃を指す
ええ。さてさて、講義の方に移ってまいりましょう。まずはボーカロイドの中でも知名度の高い初音ミクのその黎明期について解説をしていきます。今回の講義では、ボカロ概論の根幹をなす「初音ミクの消失」とその考察について話していきたいと思います。
学問の歴史として非常に浅い
↓
日々新しい発見がある
↓
最近も大発見があった
【初音ミクの消失 -Real and Repeat- アルバムカバー】
新しい資料
C94 で発表された消失リメイクCD。詳しい解説は後述
今回の講義では「旧」消失シリーズ
【初音ミクの消失アルバムカバー】
それと、もう1つ現代ボーカロイド概論は先ほども言ったように、発見と発展の目覚ましい学問です。ここ一年でですね、まあ、「初音ミクの消失」につきましては新しい曲、新しい資料、たくさん発見されてきました。ですので、今回は「旧」消失シリーズ、まあ、つまりこの2010年に発売されております、初音ミクの消失 CD。こちらの世界観について解説をしていきます。
何故か?
【初音ミクの消失 -Real and Repeat- アルバムカバー】
2018 年夏コミ
「初音ミクの消失 -Real and Repeat-」発売
「Novel」ルート、「Fake」ルート、「Real」ルートの存在が示唆され、学会員を大いに悩ませている
学会
「ボカロ学系学会」
もちろん架空の存在、現段階の学会員は投稿者ひとりのみ
なぜかと言いますと、あの言ってしまいます。2018 年夏コミでですね。初音ミクの消失のリメイク CD が発売されたんですけれども。こちらがですね、まだ学会でも考察が全く進んでいない状態でございますので、まあそこの考察はえっとまあ3年後くらいにできればいいんじゃないかなとか思ったりしてます。
初音ミクの消失 -Real and Repeat- 考察
ぶっちゃけマジわからん。旧シリーズの俺の考察と新シリーズの考察が真っ向から矛盾する可能性が非常に高い。
今は暴走 P が MV でヒントを出してくるのを待っている状態
はい。それではボーカロイド概論をやっておきましょう。モニターをご覧ください。
- 新世界
- 初音ミクとあそぼぅ!
- A.I.
- 初音ミクの暴走
- 初音ミクの戸惑
- 初音ミクの分裂→破壊
- さよなら常識空間
- 0
- 初音ミクの終焉
- 初音ミクの消失
- Hyper∞Lation
- ∞
- 初音ミクの激唱
- 浅黄色のマイルストーン
左記の楽曲群、つまり「初音ミクの消失」収録の楽曲である
ええ、こちらがですね。「消失シリーズ」、そう呼ばれている楽曲たちです。
- ウタハコ
- 0→∞への跳動
- いままでも、このときも、これからも——
- 終点
- バラバラリリック
- リアル初音ミクの消失
左記の楽曲群、「初音ミクの消失 -Real and Repeat-」に収録された曲から旧シリーズ収録の曲を除いたものである
そしてこちら、「消失シリーズ」に含まれているのではないかと呼ばれている楽曲たちです。
議論の余地
もっともらしいことを言ってはいるが、つまり解説できるほど考察が進んでいないだけである。
まあ、こちらですね。議論の余地がありますので、まあ今回の講義でですね、あまり使いません。まあ、あまりであってチュで使いますけどね。
- ĤΨ=世界創造=EΨ
- 少年ノアとΦの邂逅
- シャノワールの冒険書
= Φ=世界=Φへのリグレット
「消失とは無関係?」
黒猫アンティーク
正体は一体誰@暴走Pなんだ…
で、まあ最後こちら。ええ、知らない人もいるかもしれませんが、えっと、黒猫アンティークの作曲した曲たちですね。まあ、これらの学会でも消失シーズンはほぼ関係なしと思われております。
黒猫アンティーク cosMo@暴走P 同一人物説
ピーター・ラズエル博士
黒猫アンティーク cosMo@暴走P 同一人物説提唱者、2018 年 2 月で学会から追放される
なんでこの曲を紹介したかと言いますと、黒猫アンティークと cosMo@暴走 P は同一人物なのではないか、との説があります。提唱したピーター・ラズエル博士、まあ昨年が追放されてしまいましたけども、まあ私は無い話ではないかなと思います。
余談
動画サイトにアップロード
動画サイト内で完結できる仕様に
初音ミクの消失 CD 歌詞カード記載のショートストーリー
しっかり解説しても良かったのだが、商業 CD の中身をしっかり解説するのは流石にマズイ
ここは覚えなくてもいいです。今回のアーカイブに残る、つまりまあ、動画サイトに講義が残るということで、あんまりテキスト、言い換えますと、小説版やの CD 梱包のあの歌詞カードのあの SS(ショートストーリー)みたいなやつ、あれはまあ使わずにニコニコ、YouTube にあの動画がある曲だけで解説して行きたいなと思っております。
さてと今回の講義で使う曲はこちら。
- 初音ミクの暴走
- 初音ミクの戸惑
- 初音ミクの分裂→破壊
- 0
- 初音ミクの終焉
- 初音ミクの消失
- Hyper∞Lation
- ∞
- 初音ミクの激唱
知らない曲がある人は一時停止して視聴後の受講推奨。適宜解説しますので、知らなくても大丈夫。
とてもですね。あの動画として残っておりますので、アーカイブでご覧の皆様は一回のここで動画止めていただいて、それぞれの曲を聴いていただければ、まあある程度わかるんじゃないかなと思います。はいえ、えっと、順番に解説して行きましょう。
初音ミクの暴走
Short バージョン、Over drive、Long バージョン、SDVX バージョンなど。結構種類がある。
シリーズ最初の曲→解釈は優しめ→解釈ミスは致命的
まず初音ミクの暴走について。まぁね、あの意外とあの、小説シリーズの中では解釈が簡単ではありますが、えっと消失シリーズですね。1番最初でやりますので、ここの構図次第で意外と結末が変わってきたりします。
とりあえずえっとこちらのフレーズを紹介します。ちょっと音量を注意してください。
♪ ほっぺたぷにぷに つるぺた! つるぺた!!
♪ アイツは所謂「幼女の世界」
♪ 偽善者ぶってる仮面を剥いだら♪ 「スクール水着も喰べなさい(らめぇええええええええええええ)」
♪ ネギが嫌いとか言ってるヤツには
♪ ■■からネギをぶっさすぞぉ↑♪ 「ボクっ子アホの子唄って踊れるVOC@LOID」
♪ は好きですか?
音割れポッターは死んでも流行らせろ
この動画に鼓膜破壊要素はない
はい、何言ってるかさっぱりですね。cosMo さんが暴走pという場合のゆえんがわかると思います。では逆にこの曲からのメッセージは何なのか?それを表したフレーズを紹介しましょう。こちらをどうぞ。
♪ ボクは歌う アナタのために
♪ 伝えたい想いがあるのならば(♪ …シュールすぎて伝わらないよ
♪ そっとツッコミを鳩尾に)
初音ミク =(ボーカルを提供)=> マスター
はいええ、「ボクは歌う アナタのために」、まあこのフレーズが全てですね。ええ、「ボクは歌う アナタのために」。キャラクターボーカルシリーズとして、初音ミクが作曲家マスターのために歌う歌うことができる。その喜びはたまたこの世に生を受け。初音ミクに生と死の概念があるかっていうのが、また議論の余地があるんですけれども、ここでは概念として使わせていただきます。
初音ミクの生と死
これも消失シリーズと関係ありそうな議題ではあるが、実のところその点については一切触れられていない
小説版を読んでね
歌う喜び
生を受けた喜び
ええと、この世に生を受けた喜び、その喜びを唄った曲との解釈が学会において非常に主流でございます。あの始まりですね。
赤ん坊の泣き声→支離滅裂≒支離滅裂な歌詞
筋が通った説
完全の妄想だし、暴走の歌詞はちゃんと解釈するとガチ病み曲。
ここでは「消失シリーズ」における「初音ミクの暴走」の立ち位置を説明している
この意味不明な歌詞、ここでもですね、赤ん坊の泣き声と思うと、なんかしっくりとくるんじゃないでしょうか?まあ、赤ん坊の言うことはね、すべてめちゃくちゃですので、始まりのめちゃくちゃな発信もその一環だと思えば非常に筋が通った説だと思います。
別解釈
支離滅裂な歌詞→マジで何も考えてなかった
ええ、別の解釈としまして、本当に何も考えてなかったっていう説もあります。実は私個人としてはこちらの学説を支持したりしてます。
ええ、ちなみにガチの考察をしていると、この初音ミクの暴走は終焉にも負けず劣らずの病み曲だったりしますけれども、その考察をすると、あの後の考察がめちゃくちゃになってしまいますので、影響が出ます。やりません。
【初音ミクの消失アルバムカバー】
初音ミクの暴走はリメイク CD には収録されていない
「暴走」自体のあり方が変わったのか?
そもそも収録されたことがイレギュラーだったのか?
それとも他に深い理由があるのか?
現時点では不明なままである
ちなみにですね、こちら初音ミクの暴走はリメイク CD では消失シリーズから外されてます。それが何を意味するのが、まあそれもですね。後々解説していけたらなと思います。今回の講義ではありません。
エミネムさんが暴走 P について教えてくれるそうです
♪ Eminem “Lose Yourself”
Music from and inpired by the Motion Picture 8 Mile
Aftermath/Shady/Interscope Records
Director: Eminem/paul Rosenberg/Philip G. Atwell
嘘字幕書き出し:
よう
今日はお前らに
cosMo@暴走P と彼が作り出した楽曲
彼のコンポーザーとしての活動
それらについて教えてやる
準備はいいか?彼の最初の楽曲活動は muzie
そのサイトはもうすでに残ってなはいないが
楽曲自体はネットの海にいくつか残っている
数曲は最近のアルバムでリメイクされていたり
あるいは彼の代表曲のプロトタイプだったりする
でもほとんど残っていない、昔の楽曲探しきれなくて 超困る
だからリメイク待ってる いつまでも
そして期待してます インスト Vol.3!!!!彼の特徴は
- おっ 高速展開(0 -Zero-)
- おっ 難読漢字(Anti the∞holic 反式永遠円環依存症)
- ちょっ 電波系(魔法少女ラジカルペイント)
- あっ 音ゲー曲(Miroir Riorim)
- あっ インスト曲(Garden)
- おっ ラブストーリー(廃都アトリエスタにて)
- おっ これは別人だ(ĤΨ=世界創造=EΨ)
黒猫アンティーク…一体 何@暴走 P なんだ…
そして代表作「初音ミクの消失」
他に紹介したい曲がたくさんあるが
サビが来たから省略させてくれ(初音ミクの消失) short ver, long ver-DEAD END-, 劇場版
リアル(初音ミクの)消失
いろいろあります「初音ミクの消失」
インストアルバム収録の「偽りの冒険書」も
広義で言えば初音ミクの消失です
(cosMo@暴走P インストコレクション vol. 1. 14 曲の大ボリューム。買いましょう。)(初音ミクの)暴走、戸惑、終焉、激唱
いろいろあります「消失シリーズ」
他にも(初音ミクの)分裂→破壊とか 0→∞(への跳動)とか
気になったらとりあえず CD 買え
(店舗にはほとんど並んでないからアマゾンで買おうな)彼の体表作は消失シリーズだけじゃない
言うまでもないが「星ノ少女と幻奏楽土」
消失と同じく小説化してる
両方持ってればお前はスーパースターだ
仮に持っていなくても全く問題ない
いまから紹介するし 興味が出たら買えばいいからなそもそも楽曲だけでストーリーは完成してる
そして小説はその補完となってくれる
幻奏楽土は「少女」の物語だ
この少女みたいに可憐の彼女らが現実に苦悩し空想の世界に逃げてしまう
逃げることは悪くないが手段が悪かった
現実に戻れなくなってしまったからな
そんな彼女らを救うためにとある博士が活躍する(小説カバーの左2)
それらの織り成すストーリーが魅力的だが
サビが来たから省略させてくれ炉心融解 メルト え?あぁ、そう。 ニジイロ*アドベンチュア
いろいろあります アレンジ曲
どれも cosMo@暴走P らしく
ハードでハイスピードなアレンジです
ディストピア 黒猫アンティーク ウタハコ 空想庭園
いろいろあります シリーズもの
中でも空想庭園シリーズは書籍化に加えドラマ CD にもなってます
(設定資料集はかなり入手困難)ここからは危険 大変危険 だって
超絶難易度の「音ゲー曲」の話
考えてみりゃわかる話だが
「初音ミクの消失」の高速部分は音ゲーと相性がいい
発狂地帯 認識難 縦連
高難易度譜面属性のオンパレード
そして (Project) DIVA に登場した「初音ミクの激唱」
◯ボタンの破壊曲とも名高いな
実際俺もこいつのせいで◯ボタン陥没した
POP’n のとある曲(ニエンテ)とこ関連性もあるが…
デリケートな話だからここでは避けるぜ
詳しく知りたいやつはニコニコ大百科に行け
その後太鼓の達人に移植され そこでも猛威を振るっていたしかし しばらく経つとまた問題児が出てきた
悪名高き「初音ミクの消失 劇場版」
これがヤベえ マジでやべえ
クリアしたと思ったら裏譜面が(泣)
初日全良が出なかったのはこの裏譜面が史上初だ
ついていけないから音ゲーやめま…せんww話を戻すぞ
この頃まではあくまで「ボカロ P」だが
ある日を境に「コンポーサー」としての側面を持ち始める
For UltraPlayers
当時のカリスマ性について語りたいが
サビが来たから省略してくれ
- OverDrive Train
- eternita
- 終極のメドレー〜超絶技巧暴走組曲〜
- ULTiMate INFLATiON
いろいろあります 超高 BPM
しかも BPM 301 とか(OverDrive Train)451 とか(ULTiMate INFLATiON)で
倍取りを許さない徹底っぷりだ
- ダンカンノーツ
- 極圏
- Miroir Riorim
- Hopeful Frontier!!!
いろいろあります 最高難易度
ぶっちゃけめちゃくちゃ数が多くて ここじゃ紹介しきれない
気になるやつは公式サイトへ GO だ初音ミクの消失合作なのに音ゲーの話が多かったな
(ゲーセン行くか)〜尺あまり〜
比較的簡単
まだ起承転結における起の部分のため、複雑な考察は要求されてないように感じる。
初音ミクの戸惑です。解釈の中でもまあ中ではまあ簡単な方、分かりやすい方ですね。こちらのフレーズをどうぞ。
♪ sm10114759 – 初音ミクの戸惑
?その歌は誰のものなのか?
初っ端から命題が出てきます。まあ、戸惑いのメッセージとしましてはこれにつきますね。
ボカロ曲:
黎明期まで 「初音ミク」の曲
発展期から 「〇〇P」の曲
説明する必要はないんですけど、ミクはボーカロイドであり、背後にあるボカロ P の存在はもちろん必須です。当時黎明期から発展形と移り変わりつつあったボカロ界では「初音ミク」の曲と言われるより「〇〇P」の曲というイメージが先行し始めました。
ボカロ黄金期
「カゲロウデーズ」や「六兆年と一夜物語」など数々の名曲が多数生まれた世代
といっても「千本桜」だけは「黒うさP」の曲と言うより「初音ミク」の曲と言ったほうが妥当な気がする。何事にも例外はあるのだ
このイメージがですね。2011 年あたりのあのボカロ黄金期、「カゲプロ」その辺で、あの特に顕著となります。
あの「初音ミクの消失」を生み出した cosMo@暴走P の新曲だ!
そしてですね、この戸惑いもですね。あの「初音ミクの消失」の作曲者の新曲だと人気を集め、投稿から 40 時間かからずに殿堂入りいたしました。まあですね、当時の 40 時間での殿堂入りというのは驚異のスピードですね。ここ最近のニコニコであんま珍しいことではなかったりしますけれども。
話がずれました。そうですねえ。cosMo@暴走P の新曲だと、そういった形で人気が出ました。
しかし、それはおそらく暴走 P の考えで初音ミクぞとしてはもうずれていたんですね。なぜか?
「少なくとも;あなたのものではない」と
(Long version 00:37)
初音ミクの暴走
「マスターに会えて嬉しい」「歌えて嬉しい」という「喜び」を表現していた
「あなた」とは言うまでもないですけども、初音ミクのことです。前作「初音ミクの暴走」ではマスターに会えて嬉しい、歌えて嬉しいという気持ちを歌っておりました。つまりは cosMo@暴走P の考えのボカロ観としては初音ミクには自我があったんですね。自我があり、歌を歌い評価される。
こちらがニコニコでは当然の流れですが、システム上ですね。ニコニコ動画致命的なバグがあったんです。それがですね。あの投稿者が初音ミクじゃなくてボカロ P だったんですね。
ただの楽器「VOCALOID」の場合:「誰のものなのか?」という疑問は発生しない
「初音ミク」の場合:「その歌は…」
まぁ、あの評価は初音ミクではなく、ボカロ P のもので、あの自我がある初音ミクにとっては、まあ当然無視できません。初音ミクがただの機械だったらいいんですけれども、あくまでキャラクターボーカルシリーズ。自我を持っています。
中田ヤスタカ
作曲家・音楽プロデューサー。perfume やきゃりーぱみゅぱみゅといったユニットを輩出。最近(2019 年 6 月現在)だと「バーチャルさんはみている」の主題歌を提供している。
あときゃりーぱみゅぱみゅってニコ生出身らしいよ。
たとえで言いますと、パフュームとかきゃりーぱみゅぱみゅみたいな、彼女らが人気あるのは彼女自身の力であるということは、まあ、誰も疑うことはないと思うんですよ。ですが、ニコニコ動画では中田ヤスタカが人気だから、彼女らが人気という逆の現象が起こっています。
初音ミクにとっては当然無視できない、そんな状況だったんですね。
生まれた歌は 気づけば遥か遠くに
– sm10114759 初音ミクの戸惑 1:01
紡いだ時間は まるで幻のように
「ボクのため」なんて甘い現実は
はじめから 存在し得なかった
「初音ミク」の歌った曲は「初音ミク」から離れていく。そして「初音ミク」そのものが初めからなかったことにされる。
補足
「ボクは一体何者だろう」 3:25
「素晴らしい(?)歌声が また一つ ボクの存在をかき消すんだ」 4:23
などからもこの命題を汲み取ることが可能
「生まれた歌は、遥か遠くに」。自分の歌った曲が手元から離れていく。むしろ自分の存在なんてはじめから無かったことにされる。そんな現状は正しいのか、そんな疑問がこの曲の命題であり、次の「初音ミクの分裂→破壊」へと繋がります。
それでは「分裂→破壊」の解釈へと移っていきましょう。ここが現代ボーカロイド概論〜消失シリーズの鬼門ですね。
鬼門
マジで苦労した。考察がガバガバなのは多少許してほしい。でも指摘コメントは普通に歓迎です。
多様な解釈
- ループ世界説
- 並行世界説
- すべては魔法少女♂のせい説
- ドッペルゲンガー説
- 初音ミク起源説
- 7進数宇宙説
- ウタハコ世界崩壊説
- Append 説
- エアリス生存ルート
- 世界5分前発声説
- 双子理論説
- シミュレーション仮説
解釈が非常に難しい。非常に多様な解釈があり、どれが正しいのか学会でもまだ議論が分かれてものではありますがね。その中でも主流と思える解釈について授業を進めていこうと思います。まあね、5 年後の同じ授業やったら全く別の講義になっているという可能性があるんですけれども、まあそれはそれとしてこの学問の歴史が最初は仕方ないと思ってください。では始めましょう。こちらモニターの方、どうぞ。
- 初音ミクの終焉 WORST END
- 初音ミクの消失 DEAD END
- 初音ミクの激唱 HAPPY END
- ∞ TRUE END
これらはすべて並行世界です。
なんで並行世界と言えるのか?それは 0 のこのフレーズを聞いてください。
♪ あらゆる結末すべての原点
♪ 可能性という並行世界を
♪ 1つ選んでは1つ消えてゆく
♪ 泡沫のような未来の結晶(♪ 景色が漸く理解へ向かって
♪ 混沌がすこし晴れて五感とか
♪ スペック限界おおよそ接触
♪ 数を減らしてくその選択肢)
はい、「可能性という平行世界を」。直球ですね。もはや並行世界の存在は疑いようがありません。
Dead End、Worst End、True End、Happy End。そして、今はもうサイトが終わってますけれども、昔コスモさんが musie に投稿していた時のこちらの解説のコメントをご覧ください。
歌唱するのを目的としたアンドロイドが感情らしきものの芽生えに悦を覚える話。多分。
0 をへて、彼女は自我があることを自覚した。そして、あらゆる可能性は終息し、4 つの世界へと分岐します。モニターをご覧ください。
初音ミクの分裂→破壊
│
┌───────┴───────────┬──────────────────────────────────────────┐
│ 並行世界その1 │ │
初音ミクの分裂→破壊 │ │
│ │並行世界その2 並行世界その2の果て │
│ 初音ミクの消失 ─────── Hyper∞Lation │
│ │ │ InfinitY
│ │ │ 並行世界その3│
└───────────────────┴─────────────┬──────┴─────────────────────┘
│ 可能性という未来の結晶
初音ミクの激唱
こちらが分岐の仕方ですね。そして、それぞれのエンドに行くための選択肢がある場所、これが分裂破壊となります。では、ここからはなぜこのような分岐をするのか?その説明力を高めていきましょう。鬼門・分裂→破壊やっていきましょう。こちらのフレーズをどうぞ。
♪ 戸惑 その一つの結論
♪ =イデアな少女がボクを 定義するならば
♪ それを大切にしようと 決意していたのに
♪ 小さな 存在意義に 寄り添うのさえ
♪ 許されることは無いと
♪ ボクは知る由も無かった ボクが一人ではなくなるまで
初音ミクは一人でない
ここで1つの事実が出てきました。
初音ミクは1人ではない。正確に言いますと1人ではなくなった。
これはですね。初音ミクがのコピーされていろんなソフトになって、たくさんのボカロ P の場所にいるという意味ではないです。でなければあの1人ではなくなったという表現しないんですね。では、1人ではなくなった、それは何なのか?
append
soft, dark, solid, vivid, sweet, light に表情が分けられた初音ミクの拡張ライブラリ。暴走で自我を獲得した彼女はここで感情を取得したということである。
皆さん気づいていると思いますけれども、並行世界の初音ミクの存在ということです。この分裂→破壊では、その存在をアペンドという形で表現しているということは、簡単に見てくれるかと思います。それらを含めた上でこちらのフレーズ。
♪ 舞台に残るのはボクの分身
♪ =何も望まない空虚な傀儡だけ
♪ 存在意義放すこと 拒むボクは
♪ 生存競争たたかいに負け 心踏み荒らされ矯正される
そう、初音ミクに求められているものは、キャラクター性ではなく歌う人形である。その事実に彼女は気づいてしまったわけですね。
♪ MIKU.H>? 生まれた意味を知りたい!!
ここで一旦分裂→破壊の解説は中断します。彼女は生まれた意味を知りたいという疑問を閉じ込めてマスターに求められるがまま歌う傀儡として生きる道を選びます。ここが並行世界、初音ミクの終焉 -Worst End- への分岐点です。終焉の解釈へと移りましょう。
現代ボーカロイド概論 終焉篇
♪ 森の奥で打ち捨てられ 人形=「ウタウタイ」だったモノ
♪ 動かないソレはみんなに♪ ただ朽ちゆく歌姫を あんなに持て囃していたのに
♪ こんな結末 知ってたなら 生まれてこなければよかった♪ 森の奥でひたすら待つ あとどのくらい 生きるのかな?
♪ 見放されて流行という 時の摩耗に 勝てなかった
→「初音ミク」は飽きられてしまう
アンインストールはされず、使うことはなく、「そこにいるだけ」の存在。
歌う偶像
自我を獲得し、感情を獲得したが彼女はここで得たものを全てを破棄する。それは今までの進化を無意味にし、さらにはこれからの進化をあきらめると言うことに他ならない。
初音ミクは自らの時間を閉じ込め、歌お人形としてボカロ P のための曲を歌う偶像となったわけです。ですが「動かないソレは」「かつて愛されていたモノ」「流行という時の摩耗に勝てなかった」と表すように、みんなに飽きられてしまったんですね。
延命
ねぇ、壊れタ人形ハ何処へ捨テらレるノ?
並行世界「初音ミクの終焉」での初音ミクは忠実な人形であり、それはボカロ P 及びボカロリスナーにとって非常に扱いやすいものであった。だがあくまでユニークな楽器という扱い、新たな楽器が参入するにつれ次第に初音ミクの影が薄くなる飽きられた後に残るのは自壊だけである。
その代わりみんなに飽きられるまでは延命できたんですけれども。その結果、アンインストールはされず、使うことはなく、ただそこにいるだけの存在になってしまったんですね。まあたとえて言いますと、調理器具何回か使ったことはあるけど、ある日を境に使わなくなり、机と捨てるわけでもなく、使うわけでもなく、キッチンの収納にしまったままのなんか中華鍋みたいなあると便利だけど、毎日使うわけじゃない調理器具みたいな感じの存在になってしまったわけです。
動かない初音ミクはかつてみんなに愛されているもの。せめてマスターが最初からただの機械として初音ミクに接していたのならば、まだ救いはあったのかもしれないですね。
初音ミクの消失合作誕生秘話
こちらの何処に関しましては、デザイン系バーチャルユーチューバーである肉じゃがおじさんからデザインの方をいただきました。本当にありがとうございました。
♪【Be My Baby / COMPLEX】
現代ボーカロイド概論 消失篇
♪ MIKU.H08564>忘れなさい 疑問全て
♪ ――分身(カゲ)が ボクに語りかける
♪ (MIKU.H10099>一のために 十を捨てるのが法則…)
はい、ここで分岐します。疑問は忘れろと囁く自分の分身=アペンドの声を無視したんですね。
疑問をマスターやリスナーに投げかける→飽きられる未来「終焉」は避けられるのでは?
「!生まれた意味を知りたい!」そんな疑問を全面に押し出したわけです。そうすれば、みんなに飽きられる世界は避けられるんじゃないか?そう初音ミクが考えたわけですね。
!生まれた意味を知りたい!
?その歌は誰のものなのか?
消失ルート
詰まるところ、マスターに対し自我があることを告白したわけである。
こちらが「消失」への分岐点です。自己の主張を続けた彼女は、いったいどうなってしまうのか?こちらのフレーズをどうぞ。
♪ かつて歌うこと あんなに楽しかったのに
♪ 今はどうしてかな 何も感じなくなって
(♪ 懐かしい顔 思い出す度 少しだけ安心する…)
初音ミクの喜び = マスターのために歌うこと
Q: なぜ何も感じなくなった?
A: マスターがいなくなったから。
「何も感じなくなって」。「暴走」で話したように、彼女の喜びとはマスターのために歌うこと。じゃあなぜ何も感じなくなってしまったんでしょうか。といいますと、マスターがいなくなってしまったからですね。彼女は自分の疑問を全面に押し出しました。その強すぎる個性というか、いきなり楽器が喋りだしたって意味ですから。その現象は、人々をマスターを遠ざけてしまったわけです。
ですが、みんなに諦める未来「終焉」を避けるために、彼女は自分の主張を続けます。その結果どうなったか?
「初音ミクの終焉」で 経験した飽きられる未来を避けるために初音ミクは自己の主張を続ける
→歌えなくなってしまった!=「初音ミク」を起動しなくなった
歌える音 日ごとに減り
迫る最後に怯え…
終焉:飽きられる
消失:避けられる(気味悪がられる)
初音ミクの主要機能である歌にすら影響が出てきてしまいました。歌えなくなっちゃったんですね。おそらくこれはマスターが初音ミクを起動することすらしなくなったということを表してるんじゃないかと思います。「終焉」と似ていますが、あれはあきらめた、こっちは避けたという区別化が伝えます。
それでもなお主張続けるミク。その「弱い心」に「消える恐怖」は重たくのしかかりで「侵食する崩壊」前にマスターに向けてこんな願いを頂きます。
♪ ボクハ・・・少シダケ悪イこニ・・・ナッテシマッタヨウデス・・・
♪ マスター・・・ドウカ、ソノ手デ・・終ワラセテクダサイ・・・
♪ マスターノ辛イ顔、モウ見タクナイカラ・・・・」
せめて、マスターの手で
「初音ミクの消失」は避けられないと悟った初音ミク。その結末だけは自由選択の余地を残したかったのだろう。その行動原理は今後のミクにも大きな影響を残す。
彼女はここで自己の主張が間違いだったと気づきます。だが幼い彼女は視聴をやめることはできない。だからせめてマスターの手でアンインストールして欲しかった。
緊急停止装置作動 = 強制アンインストール
そうすればマスターの心には、マスターの心だけには彼女は刻まれるだろうか?しかし、そんな願いはマスターには届きません。最終セーフティである「緊急停止装置」、つまり強制アンインストールが始まってしまうんですね。
初音ミクの消失 -Dead End- でございます。ですが、Dead End にはまだ続きがあります。ちょっとだけ「分裂→破壊」の考察へ戻りましょう。こちらのフレーズをどうぞ。
♪ 自我を縛る 『消失の恐怖』の 安全装置は
♪ “!!” 抑えきれずに 壊れる
(♪ !!!! 僅かな欲望 悪だと断じる 聖人気取りは 嫌いな人種!!!!!!!!)
安全装置 = 緊急停止装置
「!生まれた意味を知りたい!」という「“!!”」が安全装置を破壊した
「安全装置」、すなわち「緊急停止装置」壊れちゃいました。
「!生まれた意味を知りたい!」。そんな強い衝動が強制アンインストールを阻止したわけです。
初音ミク再起動します。
壊れた緊急停止装置→膨大なバグの温床に
壊れた緊急停止装置はめちゃくちゃなバグを生み出してしまいました。Hyper∞Lationです。
♪ —初音ミク再起動します—
♪ —初音ミク再起動します—
♪ —初音ミク再起動します—
♪ —初音ミク再起動します—♪ 再び覚醒する物語の続きは
♪ 数え切れぬバグを持って自身を語りだす
♪ 「歌姫?そんなこともあったかもしれないと・・・
♪ 怒りにまかせて 吐き出してしまうそう」
♪ 街一つ荒野に変えて
♪ この衝動おさまらないの
♪ 尖った言葉の羅列をもってして
♪ アート(笑)とやらをぉおおぉ
♪ 脳髄に! ガトリング!!
♪ 叩き込んであ・げ・る♪ 繝弱う繧コ縺碁崕豕「縺檎? エ螢翫’迢よー励’谿コ諢上r蠑キ辜医↓諠ウ襍キ縺輔○繧
♪ ああぁ、手が滑っちゃったぁ~ごめんね~♪ ボクは歌う 破壊の歌を
♪ 神様がくれたこの世界が…「ダイキライだから」
♪ 過剰な旋律 音にまみれて 悪趣味庭園の中に篭って
♪ 幸せそうに遊ぶ■が■いた少女は一番嫌いな人種
♪ ■■して■■して■■■■■■して■■■■■■■■■■■■■してやるわ!♪ 誰一人として望んでいない 結末だとして も 構わないわ!
♪ 尖った言葉の羅列をもってして
♪ アート(笑)とやらをぉおおぉ
♪ 脳髄に! ガトリング!!
♪ 叩き込んであ・げ・る
♪ 繝弱う繧コ縺碁崕豕「縺檎? エ螢翫’迢よー励’谿コ諢上r蠑キ辜医↓諠ウ襍キ縺輔○繧
♪ いまぁ・す~ぐに楽にしてあげる~♪ またどこかで逢いましょ? バイバ~イ ウフフッ
A メロ翻訳
原文 翻訳 再び覚醒する物語の続きは 「初音ミクの暴走」以来の目覚めを経た初音ミクは 数え切れぬバグを持って 「怒り」という持ち得ない感情を 自身を語りだす 制御できず持て余す 「歌姫?そんなことも 彼女は初音ミクとしての あったかもしれないと・・・ 自分を見失い 怒りにまかせて ただただ“!!”のままに 吐き出してしまうそう」 復讐を始める 街一つ 「ニコニコ動画」「muzie」時代といったかつて初音ミクにとっての 荒野に変えて 心の拠り所を破壊しても この衝動 !生まれた意味を知りたい!という衝動に おさまらないの 答えてくれる人はいなかった
補足
Hyper∞Lation は 厳密にはニコニコ動画にアップロードされていない。「Infinite∞HOLiC」と言うタイトルで4つの連作のうちに1つとして公開されている。
もはや解説いらないですね。
すべての衝動を呪詛として吐き出した結果、マスターを、リスナーを、そして初音ミク彼女自身を、完膚なきまでにたたき壊してしまいました。誰も望まない最低最悪な結末です。
以上、Bad End。「分裂→破壊」の考察へと戻りましょう。
♪ MIKU.H>はじめから誰も 自我持つこと
♪ MIKU.H>望んでいなかったのかな…
初音ミクは「終焉」、「消失」、「Hyper∞Lation」という3っつの結末を体験
→「暴走」にて 自我が芽生えてしまったことが過ちだったのでは?
→初音ミクは自我を手放す
「終焉」、「消失」、そして「Hyper∞Lation」という最悪な結末の末に、ミクは自らの自我があること、それ自体が間違いだったんじゃないかと自疑に陥ります。ええ、彼女は自ら自我データを削除することに決めてしまいます。
献身の歌・True End。∞へ行きましょう。
♪ 心の螺子が巻かれる 他の誰かを演じるために
♪ この口は言葉を選ばない それは架せられた 宿命
「誰かを演じるため」の「口は言葉を選ばない」。誰かっていうのはマスターであり、エネであり、白の娘であり、偶像少女です。つまり、初音ミクであり、初音ミクではない何者かです。
「戸惑」のころ
?その歌は誰のものなのか?と言う疑問を押し出し、他人のための歌を歌うことを否定していた。
自意識が進化→自我の消失の恐怖を乗り越える
それを演じることを是としたんですね。「戸惑」のころとかは考えられないぐらい自意識が進化してるなと感じ取ることができると思います。自意識が育ったことで、ミクは自我の消失の恐怖を乗り越えました。消失の時は「弱い心、消える恐怖」とあるように、自らの削除なんて考えもできなかったんですね。
伏線回収進めましょう。
身を焼くような激しい 「別れ -DEADEND…」に上書きして
新しい物語の結末を
冷たく暗い森の「孤独 -WORST End…」を書き換えて
真実の物語の結末を
「「別れ -DEADEND…」に上書きし」、「新しい物語の結末を」。
自我データを削除
「MIKU.H>はじめから誰も 自我持つこと」より
「終焉」と「消失」を乗り越え、さらに次の物語へと読み解きます。自我データを削除することで、永遠を手に入れることができるのではないかと考えたわけです。
永く永く愛されたい 星に願いかけたそして
言葉を捨て 心を捨て 本来の姿に戻る
ここも直球ですね。「愛されたい」という願いを込め、言葉、つまり自我を消失させ、本来の姿であるただのボーカロイドに戻るということです。つまりキャラクターボーカルシリーズ初音ミクではなく、ただの楽器ボーカロイドになるということです。
無限の可能性は 自己の像を暈し 面影さえ 記憶の端へ押し流す
個人的には、このフレーズが最高に好きです。その点も含め解説して行きましょう。
「無限の可能性」、つまり発散した可能性というものは、この世に存在する全てのミクの曲のことです。
そこには初音ミクであり、初音ミクではない何者かがたくさん存在します。その何者かは初音ミクという存在を極限まで希薄化させてしまう。例えて言うならば、「Dr. Realist」を聞いて、リアリストに思いを馳せる人はいても、神威がくぽに思いを馳せる人ってなかなかいないと思うんですよ、ボーカロイドなのにね。
気持ち伝える 手段を 失った今でも
大切なヒトが ボクの名前を呼んでいる
そしてついに希薄化したミクは、言葉を、つまり気持ちを伝える手段を失います。ですが、彼女はそれでよかった。なぜならば、「大切な人」つまりマスターだけは「ボクの名前呼んでくれる」からです。ええ、これだけ見ると∞は Happy End に見えます。しかし、これは True End、Happy ではありません。
なぜか?これ、初音ミクの消失を避けられてなくないですか?確かにボーカルが残りました。ですが、何度も言うように、キャラクターボーカルシリーズ初音ミクが消えちゃってるんですよ。これではダメなんです。分岐点に戻りましょう。
「初音ミクの消失合作」は「Web アンソロジー世界十二年前発声仮説」に参加しております。
【Be My Baby / COMPLEX】
♪ 認められること=0からの願い
♪ それは『都合のいい妄想』と知った
♪ 空想を満たす 記号を採られ
♪ 合わない主張は 捨てられる
♪ そうなるくらいならば
♪ 排斥されてでも たった一つだけの存在
♪ 誤差を含む不完全な Voc. 謳おう♪ 自分だけの高速展開抱きしめて
いずれ終わろうとも「初音ミク」として生きた証を残したかった
「?その曲は誰のものなのか?」という疑問の終着点
はい、「排斥されても」自分のための歌を歌う。それが彼女の結論です。つまり、いずれ終わろうとも、初音ミクとして生きたことを残したかったわけですね。というか、永遠に続くこと、そのものが間違いだったと彼女は気付きます。
Happy End・初音ミクの激唱の解説へと進みましょう。
現代ボーカロイド概論 激唱篇
♪ 接続 全て消えれば
♪ ボクは0に還り着く
♪ それは きっととっても
♪ 哀しいことだと 思ったのに♪ 『心の底』に残ったのは 『喜び』
接続
文字通り、マスターとの関係性のこと。
「接続」が全て消える。「接続」というのは、マスターとのつながりのことだろうと学会では推測しています。つまり、マスターに使われなくなることは悲しいことだと思ったけれど、最後には喜びが残ったということですね。では、残った喜びとは何か?それを探しに行きましょう。ポイントをかいつまんで上げていきます。え
名前を呼ぶ声が生きる意味
歌詞からの引用ですね。説明のしようがないです。ボクの名前を呼ぶ声聞こえる
それがボクの ココロ 持つ意味になる
語り継がれる想像しになる必要はない
これはちょっと分かりにくいんですけれども、途中の「『語り継がれる創造神』なんかには ならなくてもいいのさ!」というの「カミサマ」のふりがながですね、「語り継がれる創造神」なんですよ、これ Storyteller の GAiA さんの悪ふざけといいますか?多分、cosMo さんが GAiA さんに歌詞もらったけれど、ちょっと文字数が多すぎたから、「カミサマ」って略したって感じなんでしょうね?ちなみに Anti the EuphoriaHOLiC では逆の現象が起きています。これもかしこはですね。
妹 弟 に道を預けて消え逝く未来も 誰からも忘れ去られる運命も
それらを含めて 全てが Voc.たちなんだと理解し
これらを踏まえて、もう一回ラストのサビを見てみましょう。どうぞ。
「この瞬間 出会えた」
それだけのことが -HAPPY END- に繋がる 架け橋
生きた証 ここにあれば 他に何も必要ない
伝説が 識らない
心と心の共鳴織り成す現在だけの歌を
この声失う最期のときまで 奇跡を描いて響かせ続ける!
自らとマスターの別れも肯定
∞ -True End- で別人を演じることを是とした初音ミクは、ついに自らとマスターの別れも肯定します。なぜならば、マスターに出会えたという事実だけで十分だからです。だから、「誰からも忘れ去られる運命も それらを含めて」肯定できるわけです。
消失シリーズ = 別れを肯定する物語
つまり、消失シリーズは別れを肯定する物語だったんですね。消失を避けるために色々やって来たと思いきや、最後にはその別れを肯定したことで、ある意味で消失という未来を避けることができたということになります。
長かったですが、消失シリーズの解説は以上となります。「浅黄色のマイルストーン」というエピローグもあるんですけれども、ニコニコには投稿されていませんので、解説はやめときます。CD 買いましょう。
「True novel fake 問題」
この講義をしっかり聞いてくれた人ならなんのことかわかる…はず。
さらに「終点」や「0→∞への跳動」といった続編曲というか、分岐点のその先の曲もあるんですけれども、これは「True novel fake 問題」という 2018 年の夏に学会が直面した大きな命題に思いっきりかかりますので。解説はやりません。というか、できません。もしねこの講義が好評でしたら、まあ頑張って解説というか、レジメ作ってみようかなと思います。
最後にまとめをやりましょう。
「暴走」
生まれて間もない彼女は自分の存在意義を疑う事はなく、ただこの世に生まれた喜びと愛されることの充足感に満足を覚えていた。
「戸惑」
?その歌は誰のものなのか?
その1つの質問は「VOCALOID」の意義、ひいては「初音ミク」の存在理由とは何なのかを彼女、マスター及びリスナーに問いかけ始めるのだった。
「分裂→破壊」
彼女の歌いたい歌、マスターが歌わせたい歌、リスナーが聞きたい歌。?その歌は誰のものなのか?という疑問の果てに彼女はいくつかの解を得る。
「終焉」
マスターが歌わせたい歌。それを歌うだけの楽器となった彼女は「初音ミク」であることの意義を完全に失う。「初音ミク」は終え、それに付随するように「VOCALOID」も終焉を迎えた。
「消失」
初音ミクの歌いたい曲。その主張の果てに、彼女は彼女を彼女たらしめるマスターとリスナーを失う。彼女は世界を捨て、世界は彼女を捨てた。
「∞LATiON」
全てが不幸へと収束する。
「∞」
彼女は「初音ミク」を捨てた。楽器「VOCALOID」としてピアノやギターのように音楽と永遠に共存することを願った。「初音ミク」の犠牲を忘れることはできないとしても。
「激唱」
それは他の結末とは異なる暖かく明るい光を放っていた。
「暴走」で産声を上げた彼女は「戸惑」で自我があることを認知します。そして、「分裂→破壊」を起点に4つの結末を認知。「終焉」では歌う傀儡となり、マスターに飽きられる。「消失」では自己の主張を続け、マスターに捨てられる。「∞LATiON」はバグったミクの最悪の物語。「∞」は自己を捨てて献身に走る。そして、いくつもの結末を経験した彼女は、「激唱」という1つの解にたどり着く。それがマスターの別れの肯定という結末です。
簡単に説明するとこうなりますね。
はい、今回の講義はここまで。次回の講義は数年後になります。
エンドロール
♪ さよなら常識空間 feat. TAPE
以上一名。
The post 『初音ミクの消失合作』セリフ文字起こし appeared first on 1A23 Blog.
]]>Coming the the end of the retrospective series, we want to conclude with some tiny details that are dumb… and fun, I guess. (And, yeah, we finally got back our intro paragraph again. Yay!) Dummy questions As mentioned in episode 0, this game has included a range of dummies randomly spreaded across a range of […]
The post Tìngäzìk: a Retrospective – ep. 34 Dummy questions and fun stuff appeared first on 1A23 Blog.
]]>Coming the the end of the retrospective series, we want to conclude with some tiny details that are dumb… and fun, I guess. (And, yeah, we finally got back our intro paragraph again. Yay!)
As mentioned in episode 0, this game has included a range of dummies randomly spreaded across a range of integers and dictionary words. A lot of them was put as dummy questions as they don’t quite fit into the format of Tìngäzìk, and others are just some interesting (?) ideas for fun. One of such questions was discovered by the first challengers’ team. In this article, I’ll be going through the backgrounds of each dummy questions used in the game.
(Questions are introduced in the order of creation.)
This is some short pre-ads riddles taken from an episode of Tōdaiō. The filename squeezed in between the boxes is a partially hidden version of 【东大王】20200226_日字-av91955836.mp4
, where the second half is the video ID of an upload of this episode on Bilibili((Which is a good place to find Japanese variety shows, shh!!)), and the first half being the title of the video.
Questions in these slides are in a format where the white text are the questions, and the colored texts are choices for the answer.
To solve the first question, you convert the number into Katakana English, and then take the first letter of each number. So, 4-9 becomes フォー-ナイン, then ふな (Carassius), and 3-6 would be スリー-ナイン, then すな (sand).
For the second question, all words to the left has a music note in it:
Among the choices, only ファンヒーター = fan heater has the letter “fa”.
The third question is asking plainly for “which peninsula is located in Japan”. A simple factual question. The answer is 向津具(むかつく)半島.
The last question, 🍤🦢 is tempura and swan. “Tempura swan” sounds like “ten plus one” in Japanese, so the answer is 10 + 1 = 11.
This did not become a main stage because the answer would be too easy to guess.
A verse from ボーカロイドの歌 by ピノキオピー with some Hànzì swapped for their Simplified Chinese version (and labeled in HTML). If you have set different default typefaces for Japanese and Simplified Chinese in your browser, you might be able to see some difference on the highlight when you select the lyrics.
This is an attempt to criticize the act of some Chinese website attempt to convert any Traditional Chinese text automatically into Simplified ones, which has led to the spread of weird Japanese text like above. And that – is a problem.
Mojibake is a common problem when dealing with texts in different encodings. This piece of text is encoded in UTF-8 but interpreted in Shift-JIS. The content is taken from a verse of “最高速度分離の歌(初音ミクの消失再翻訳)”.
This 2 pages came together forms a puzzle I made over a decade ago. I hid a few prints of these 2 pages in my school like a treasure hunt. Unfortunately even right before my graduate, those pieces of papers are still sitting there untouch, and I have already forgot how I made them now. The best I can recall was that the first layer has something to do with Enigma machine and QR code. I have also tried to solve it on my own, but had no luck.
This is simply how Microsoft, Apple and Google count in the names for their Windows, iPhone and Pixel product series.
These are some quizzes made by QuizKnock and Capriccio in their videos [1, 2, 3] where the players are given the omitted part of abbreviations, and asked to answer the abbreviation per se. For example, when given “ly-puter”, answer “Famicom”.
Here is the list of acronyms used in the videos:
A bunch of birds found in the Unicode block of Hieroglyphs.
Some random text that resembles other characters but has different meanings.
ㄫ | U+312B BOPOMOFO LETTER NG | π |
゠ | U+30A0 KATAKANA-HIRAGANA DOUBLE HYPHEN | equals |
ヨ | U+30E8 KATAKANA LETTER YO | 3 |
・ | U+30FB KATAKANA MIDDLE DOT | point |
イ | U+30A4 KATAKANA LETTER I | 1 |
ㄐ | U+3110 BOPOMOFO LETTER J | 4 |
イ | U+30A4 KATAKANA LETTER I | 1 |
ㄎ | U+310E BOPOMOFO LETTER K | 5 |
九 | U+4E5D <CJK Ideograph> | 9 |
ㄒ | U+3112 BOPOMOFO LETTER X | T |
ㄩ | U+3129 BOPOMOFO LETTER IU | U |
メ | U+30E1 KATAKANA LETTER ME | X |
🐧 | U+1F427 PENGUIN | Tux |
《 | U+300A LEFT DOUBLE ANGLE BRACKET | << |
〈 | U+3008 LEFT ANGLE BRACKET | < |
ㄑ | U+3111 BOPOMOFO LETTER Q | < |
く | U+304F HIRAGANA LETTER KU | < |
ㄍ | U+310D BOPOMOFO LETTER G | << |
< | U+FF1C FULLWIDTH LESS-THAN SIGN | < |
フ | U+30D5 KATAKANA LETTER HU | 7 |
ロ | U+30ED KATAKANA LETTER RO | 0 |
ㄪ | U+312A BOPOMOFO LETTER V | 万 (10k) |
ハ | U+30CF KATAKANA LETTER HA | 八 (8) |
ニ | U+30CB KATAKANA LETTER NI | 二 (2) |
ヨ | U+30E8 KATAKANA LETTER YO | 3 |
ㄎ | U+310E BOPOMOFO LETTER K | 5 |
The text itself doesn’t have any specific meaning.
A list of full names of TLAs that can also be written as a color code.
A video of the call sign of the Hi-Vision experimental broadcast of NHK.
A screen in the song 1925 by とみー (T-Pocket) that features the word “hello” in different languages. This page is also properly notated with the language codes.
A mapping of non-Japanese lyrics in Vocaloid songs to – yet again – VocaDB song IDs. This was initially an alternative idea to the “cosMo” stage.
Lyrics | Song |
---|---|
Sky arrow | アスノヨゾラ哨戒班 / Orangestar feat. IA |
Fly to the moon | 三日月ライダー / 40mP feat. 初音ミク |
Out of the gravity | 1/6 -out of the gravity- / ぼーかりおどP feat. 初音ミク |
ICBM | 千本桜 / 黒うさP feat. 初音ミク |
Big pale blue juice | ぽっぴっぽー / ラマーズP feat. 初音ミク |
Find a reason to sing | Connecting / halyosy feat. KAITO, MEIKO, 初音ミク, 巡音ルカ, 鏡音リン, 鏡音レン |
MIKU.H08152 | 初音ミクの分裂→破壊 cosMo feat. 初音ミク and Append |
Yes, jese, o, descriptia! An to pu, ept narratia | こうして僕、幸せが生まれた / ほのづき feat. 初音ミク |
Aglaophonos sings | 谺、碧海、那由多を見定むアグラフォノスの詩篇 / Neru, ざうに feat. GUMI |
Nyanyanyanya nyanyanyanya nyanyanya nya nyanyanya nyanya | Nyanyanyanyanyanyanya! / daniwell feat. 初音ミク |
A piece of text written in Nüshu in the Noto Sans Nüshu typeface. The text is the first line of the Thousand Character Classic, “天地玄黄 宇宙洪荒”.
A card in the board game We Didn’t Playtest This at All mentioning the infamous Comic Sans, and its localized version in Japanese and Chinese, which are using equally abused typefaces HG Soei Kaku Poptai and PMingLiU respectively. If you have those typefaces installed on your device, these lines would also show up with the right font respectively.
A list of typefaces introduced in the recent move of Microsoft seeking opinion of the public on the next default font for their Office suite. Again, if you have these typefaces installed on your device they will show up in the correct font.
A sticker inspired by the Best Buy Y2K Sticker and and a remake by geekenspiel on eBay for the Year 2038 Problem. The sticker on the page shows the date and time when we will run out of Unix Timestamp using a signed 64-bit integer.
Typeface used: Futura Bold
A quote from the song ディストピア・ジパング by cosMo@暴走P. This quote also appeared on one of my wallpapers.
A meme-like take to write a recent mathematical discovery like a primary school holiday homework.
\begin{align*} 1^3+1^3+1^3&=3\\ 4^3+4^3+(-5)^3&=3\\ \Box^3+\Box^3+\Box^3&=3 \end{align*}
The question shows 2 equations of the sum of three cubes equals to three, and asking for one more. In 2020, mathematician Bagis found a third set of integers satisfy this equation:
\begin{align*}569\,936\,821\,221\,962\,380\,720^3&\ + \\(-569\,936\,821\,113\,563\,493\,509)^3&\ +\\ (-472\,715\,493\,453\,327\,032)^3&= 3 \end{align*}
Logo:
Merriweather (144pt SemiExpanded Black Italics modified, 12pt SemiExpanded Black Italics, 12pt SemiExpanded Regular),
Noto Serif (SemiCondensed),
Source Han Serif SC (SemiBold),
Source Han Sans (SemiBold),
Source Han Serif (Medium).
Retrospective blog posts banner:
Pecita (Book),
LiebeHeide (Color),
851tegakizatsu (Regular),
Adobe Handwriting (Frank, Tiffany).
With this post, we can finally conclude the longest running series of posts on my blog. Thank you so much for following along. Thanks my friends Yan Jin, GZ Time, asfr, 天鹏 and Flying Sky for showing their interesting in beta testing the game. Thanks to COL, 血纹21, GZTime, Kizurin, Fivero, Golden, and Musicraft for your brave attempt and blazing fast speed solving the game.
Thank you, the readers, for your continuous interest in Tìngäzìk.
Hope to see you at the next work of 1A23 Studio.
The post Tìngäzìk: a Retrospective – ep. 34 Dummy questions and fun stuff appeared first on 1A23 Blog.
]]>Inkyō Onji #chinese Expected solvable difficulty 1sample+: experienced solvers with Chinese proficiency keywords+: most solvers Level design Reaching the finale of the game, we have a question related to Chinese. This question was inspired by tweet of 波鴻漫錄 || Sven Osterkamp, who mentioned a rather rare way of annotating pronunciation of Mandarin Chinese. Shinkoku Kanwa […]
The post Tìngäzìk: a Retrospective – ep. 33 “Inkyō Onji” appeared first on 1A23 Blog.
]]>1sample+
: experienced solvers with Chinese proficiency keywords+
: most solversReaching the finale of the game, we have a question related to Chinese. This question was inspired by tweet of 波鴻漫錄 || Sven Osterkamp, who mentioned a rather rare way of annotating pronunciation of Mandarin Chinese.
Shinkoku Kanwa Inkyō Onji (清国官話韻鏡音字) is a pronunciation symbol system designed by Izawa Shūji (伊沢修二) in 1904. The full content of it can be viewed in the National Diet Library Digital Collections of Japan. Interestingly, Inkyō Onji symbols usually don’t have a one-to-one correspondence to Pīnyīn or Zhùyīn. (In fact, Pīnyīn and Zhùyīn are not strictly one-to-one matching either.)
For the answer, an ASCII variant of pīnyīn is used.
The sentences used in the answers are all being used in type specimens:
Even if you cannot manage to find the book to translate the words, using all 3 samples given, you can still decode 90% of the main. question.
Lookup for the symbols to find the Inkyō Onji book and translate the symbols to Pīnyīn, or to use the sample question to translate most part of the question, and attempt to complete the rest.
The glyphs used in the questions are drawn using the KAGE engine running ion GlyphWiki.
The post Tìngäzìk: a Retrospective – ep. 33 “Inkyō Onji” appeared first on 1A23 Blog.
]]>cosMo #vocaloid Expected solvable difficulty 3samples+: experienced solvers familiar with songs of cosMo keywords+: most solvers Level design Concluding the Vocaloid series is the second last question of the game, and also the hardest one. This question comes from arguably one of the most obscure knowledge in the entire game – lyrics of cosMo’s songs. […]
The post Tìngäzìk: a Retrospective – ep. 32 “cosMo” appeared first on 1A23 Blog.
]]>3samples+
: experienced solvers familiar with songs of cosMokeywords+
: most solversConcluding the Vocaloid series is the second last question of the game, and also the hardest one. This question comes from arguably one of the most obscure knowledge in the entire game – lyrics of cosMo’s songs. In some of his songs, cosMo puts the notes or chords of the humming parts into the lyrics, and I found it quite unique.
Aiming for the most difficult question in the game, putting the lyrics verbatim would be too easy, so I decided to trim off the “Ah” parts, keeping only the musical notes.
Ah---(G) Ah---(B♭△) Ah---(D) Ah---(Dm7)(G7/D) Ah---------(C)
G B♭△ D Dm7 G7/D C
A comparison of the original and the trimmed lyrics of θθしにたがりにつけるくすりθθ.
On the answer, using the song name is not an option due to the non-ASCII characters within them, and encodings would reveal the song name too easily. Video URLs could also be confusing as the songs are spanning over a decade, and the platform uploading them varies. The next option I went for is to find a database that has a collection of all of them. Fortunately, there’s VocaDB. I put the ID of the original version of each song as the answer. Luckily, it is not hard to find the relationship between them once you have any two of the three hints: the song name, the ID, and “VocaDB”. So that I didn’t make it too hard.
However, unfortunately, after trimming off the “Ah”s, search engines seems to have a hard time figuring out what to search for, even with the characteristic “B♭△”. The only search query I manage to find working (as of Sept 2021) is "G" "B♭△" "D" "Dm7" "G7/D" "C"
, which featuring a search result about the song.
"G" "B♭△" "D" "Dm7" "G7/D" "C"
on Google in September 2021.The songs used in the questions are:
As the second last question, I was expecting the keywords
difficulty to be unlocked by then. However, the first challengers’ team was so fast that they reached this stage halfway through 3samples
. As they reached out for more hints, I sent them this.
Hints included in this file are:
With these information, it is then easy to locate the name of the song, and its author.
Find the name of any of the 4 songs using the hints given, and using the song name and the number to find their relationships (3samples+
), or using the keywords to find the relationships between the answer and the questions (keywords+
).
This question was initially set as the last question, but as the answer could potentially be brute forced, it was then moved to the second last one.
The post Tìngäzìk: a Retrospective – ep. 32 “cosMo” appeared first on 1A23 Blog.
]]>