diff options
author | Chris Xiong <chirs241097@gmail.com> | 2024-02-17 20:44:52 -0500 |
---|---|---|
committer | Chris Xiong <chirs241097@gmail.com> | 2024-02-17 20:44:52 -0500 |
commit | 891f8eee12e6bdb2fad0fe0b28976362eb965236 (patch) | |
tree | 8a78ffa14ecf3c8893fbfd441cf50b1978ee33cd | |
parent | d5e40e5890cd99144a44e2922fd97ddaa9968c14 (diff) | |
download | web-891f8eee12e6bdb2fad0fe0b28976362eb965236.tar.xz |
Massive blog regeneration. RBUS-related posts.
99 files changed, 5424 insertions, 2913 deletions
diff --git a/blog/list/0.html b/blog/list/0.html index dd8c625..24818f0 100644 --- a/blog/list/0.html +++ b/blog/list/0.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -57,20 +57,20 @@ function ol() <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#special-page</span> <span class="right" id="">2019-09-03/2019-09-03</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2023-11-13.html">Framework Laptop: Repasting & Two Year Report</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2024-02-04.html">RBUS-ADAT devlog</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #computer-repairing</span> - <span class="right" id="">2023-11-13/2023-11-28</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #electronics</span> + <span class="right" id="">2024-02-04/2024-02-17</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2022-11-27.html">(Not really) Musical Answers & Rants</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2024-02-02.html">R-BUS Technical Information</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #midi</span> - <span class="right" id="">2022-11-27/2022-12-02</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #electronics</span> + <span class="right" id="">2024-02-02/2024-02-13</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2022-07-23.html">Framework Laptop: The next thing in the laptop world?</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2023-11-13.html">Framework Laptop: Repasting & Two Year Report</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #hands-on #computer-repairing</span> - <span class="right" id="">2022-07-23/2023-11-14</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #computer-repairing</span> + <span class="right" id="">2023-11-13/2023-11-28</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/1.html b/blog/list/1.html index 0c60a17..52a5d9b 100644 --- a/blog/list/1.html +++ b/blog/list/1.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,6 +47,16 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2022-11-27.html">(Not really) Musical Answers & Rants</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #midi</span> + <span class="right" id="">2022-11-27/2022-12-02</span></div> + </div><div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2022-07-23.html">Framework Laptop: The next thing in the laptop world?</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #hands-on #computer-repairing</span> + <span class="right" id="">2022-07-23/2023-11-14</span></div> + </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2021-10-10.html">EDIROL SD-20: the Crumbling of the Canvas?</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music</span> @@ -60,17 +70,7 @@ function ol() <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2020-11-20.html">EDIROL SD-80: The Adventure Continues</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music</span> - <span class="right" id="">2020-11-20/2022-07-01</span></div> - </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-09-04.html">September 2019 Site Update</a></h3> - <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web</span> - <span class="right" id="">2019-09-04/2019-11-12</span></div> - </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-04-25.html">EDIROL SD-80: A Trapped Beast</a></h3> - <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music #hands-on</span> - <span class="right" id="">2019-04-25/2022-06-30</span></div> + <span class="right" id="">2020-11-20/2024-02-11</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/10.html b/blog/list/10.html index a906fc5..4994ce1 100644 --- a/blog/list/10.html +++ b/blog/list/10.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,6 +47,21 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-01.html">Hackathon 2015乱搞记</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span> + <span class="right" id="">2015-11-01/2015-11-22</span></div> + </div><div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-31.html">大学入学两个月了……</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> + <span class="right" id="">2015-10-31/2018-10-11</span></div> + </div><div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-30.html">First CCPC sightseeing tour</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest</span> + <span class="right" id="">2015-10-30/2018-10-11</span></div> + </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-29.html">noname01.pas</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> diff --git a/blog/list/2.html b/blog/list/2.html index 3b68430..b4fc4b9 100644 --- a/blog/list/2.html +++ b/blog/list/2.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,30 +47,30 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-02-13.html">Site Revamp and Other Rants -- 2019 Edition</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-09-04.html">September 2019 Site Update</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp #garbage</span> - <span class="right" id="">2019-02-13/2019-07-24</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web</span> + <span class="right" id="">2019-09-04/2019-11-12</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-12-06.html">小米 MIX 3 上手体验</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-06-24.html">Working as an intern for "the spyware corporation"</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #hands-on</span> - <span class="right" id="">2018-12-06/2021-01-30</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #sophistry</span> + <span class="right" id="">2019-06-24/2024-02-17</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-10-11.html">The stupid blogging system evolved!</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-04-25.html">EDIROL SD-80: A Trapped Beast</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #devel #js</span> - <span class="right" id="">2018-10-11/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music #hands-on</span> + <span class="right" id="">2019-04-25/2022-06-30</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-07.html">Should this site still be alive by 2035...</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-02-13.html">Site Revamp and Other Rants -- 2019 Edition</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span> - <span class="right" id="">2018-06-07/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp #garbage</span> + <span class="right" id="">2019-02-13/2019-07-24</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-05.html">Software Project Management in the Free Software World</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-12-06.html">小米 MIX 3 上手体验</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry</span> - <span class="right" id="">2018-06-05/2018-10-16</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #hands-on</span> + <span class="right" id="">2018-12-06/2021-01-30</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/3.html b/blog/list/3.html index a3195a8..eed47a5 100644 --- a/blog/list/3.html +++ b/blog/list/3.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,30 +47,30 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-18.html">Ideology vs Pragmatism &c.</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-10-11.html">The stupid blogging system evolved!</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span> - <span class="right" id="">2018-05-18/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #devel #js</span> + <span class="right" id="">2018-10-11/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-08.html">Respecting your job</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-07.html">Should this site still be alive by 2035...</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage #acmicpc</span> - <span class="right" id="">2018-05-08/2019-02-12</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span> + <span class="right" id="">2018-06-07/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-03.html">Are you an Apple fanboy/fangirl?</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-05.html">Software Project Management in the Free Software World</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #interactive</span> - <span class="right" id="">2018-05-03/2019-02-09</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry</span> + <span class="right" id="">2018-06-05/2018-10-16</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-22.html">ICPC类比赛中计算几何问题之「乱象」</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-18.html">Ideology vs Pragmatism &c.</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #acmicpc</span> - <span class="right" id="">2018-04-22/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span> + <span class="right" id="">2018-05-18/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-17.html">The "Deepin is spyware" problem</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-08.html">Respecting your job</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#linux #garbage #sophistry</span> - <span class="right" id="">2018-04-17/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage #acmicpc</span> + <span class="right" id="">2018-05-08/2019-02-12</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/4.html b/blog/list/4.html index 663c2e8..9c1da80 100644 --- a/blog/list/4.html +++ b/blog/list/4.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,30 +47,30 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-03-17.html">Some rants on SMELT, QMidiPlayer and Virtools</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-03.html">Are you an Apple fanboy/fangirl?</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #opengl</span> - <span class="right" id="">2018-03-17/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #interactive</span> + <span class="right" id="">2018-05-03/2019-02-09</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-02-05.html">Does gaming make me merrier & more relaxed or the opposite?</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-22.html">ICPC类比赛中计算几何问题之「乱象」</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> - <span class="right" id="">2018-02-05/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #acmicpc</span> + <span class="right" id="">2018-04-22/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-07.html">Trash dump for the fifth semester</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-17.html">The "Deepin is spyware" problem</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span> - <span class="right" id="">2018-01-07/2018-10-30</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#linux #garbage #sophistry</span> + <span class="right" id="">2018-04-17/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-05.html">Now using reverse proxy to deliver content</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-03-17.html">Some rants on SMELT, QMidiPlayer and Virtools</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp</span> - <span class="right" id="">2018-01-05/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #opengl</span> + <span class="right" id="">2018-03-17/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-12-21.html">为什么我<i>就是不</i>使用Mac</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-02-05.html">Does gaming make me merrier & more relaxed or the opposite?</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #device-review</span> - <span class="right" id="">2017-12-21/2019-02-12</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> + <span class="right" id="">2018-02-05/2018-10-11</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/5.html b/blog/list/5.html index fd88ca6..8704fb7 100644 --- a/blog/list/5.html +++ b/blog/list/5.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,30 +47,30 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-11-25.html">A short post on Cakewalk's death and my music production</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-07.html">Trash dump for the fifth semester</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #garbage</span> - <span class="right" id="">2017-11-25/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span> + <span class="right" id="">2018-01-07/2018-10-30</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-29.html">Trash dump for the fourth semester</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-05.html">Now using reverse proxy to deliver content</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span> - <span class="right" id="">2017-06-29/2021-06-26</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp</span> + <span class="right" id="">2018-01-05/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-09.html">Fuck Windows et cetera</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-12-21.html">为什么我<i>就是不</i>使用Mac</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span> - <span class="right" id="">2017-06-08/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #device-review</span> + <span class="right" id="">2017-12-21/2019-02-12</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-05-08.html">2017省赛流水帐</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-11-25.html">A short post on Cakewalk's death and my music production</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span> - <span class="right" id="">2017-05-08/2019-02-12</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #garbage</span> + <span class="right" id="">2017-11-25/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-04-11.html">SBS 2.0 is now the default blog browser</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-29.html">Trash dump for the fourth semester</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #web</span> - <span class="right" id="">2017-04-11/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span> + <span class="right" id="">2017-06-29/2021-06-26</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/6.html b/blog/list/6.html index 8fad1d6..52d5a29 100644 --- a/blog/list/6.html +++ b/blog/list/6.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,30 +47,30 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-02-13.html">[多大图警告]ls /dev</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-06-09.html">Fuck Windows et cetera</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review</span> - <span class="right" id="">2017-02-13/2019-02-12</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span> + <span class="right" id="">2017-06-08/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-18.html">Trash dump for the third semester</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-05-08.html">2017省赛流水帐</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span> - <span class="right" id="">2017-01-09/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span> + <span class="right" id="">2017-05-08/2019-02-12</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-09.html">[多大图警告]终究还是改不了修电脑的命</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-04-11.html">SBS 2.0 is now the default blog browser</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#computer-repairing #garbage</span> - <span class="right" id="">2017-01-09/2019-02-12</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #web</span> + <span class="right" id="">2017-04-11/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-09-24.html">2-in-1</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-02-13.html">[多大图警告]ls /dev</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #c++ #qt</span> - <span class="right" id="">2016-09-24/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review</span> + <span class="right" id="">2017-02-13/2019-02-12</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-06-21.html">Trash dump for the first academic year</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-18.html">Trash dump for the third semester</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span> - <span class="right" id="">2016-06-21/2018-10-11</span></div> + <span class="right" id="">2017-01-09/2018-10-11</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/7.html b/blog/list/7.html index e9efb28..ff9f3e7 100644 --- a/blog/list/7.html +++ b/blog/list/7.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,30 +47,30 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-05-12.html">ThinkPad X1 Yoga初体验</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-01-09.html">[多大图警告]终究还是改不了修电脑的命</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review</span> - <span class="right" id="">2016-05-12/2019-02-12</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#computer-repairing #garbage</span> + <span class="right" id="">2017-01-09/2019-02-12</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-04-09.html">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-09-24.html">2-in-1</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #midi</span> - <span class="right" id="">2016-04-09/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #c++ #qt</span> + <span class="right" id="">2016-09-24/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-03-26.html">ACM校赛水题组酱油记</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-06-21.html">Trash dump for the first academic year</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span> - <span class="right" id="">2016-03-26/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #daily-life</span> + <span class="right" id="">2016-06-21/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-18.html">Cross Noodles Recooked</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-05-12.html">ThinkPad X1 Yoga初体验</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #js #webgl</span> - <span class="right" id="">2016-02-18/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review</span> + <span class="right" id="">2016-05-12/2019-02-12</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-14.html">Why Do I Prefer a Computer over a Girlfriend/<s>(Boyfriend)</s></a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-04-09.html">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry</span> - <span class="right" id="">2016-02-14/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #midi</span> + <span class="right" id="">2016-04-09/2018-10-11</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/8.html b/blog/list/8.html index ed4dc07..47fb33a 100644 --- a/blog/list/8.html +++ b/blog/list/8.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,30 +47,30 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-25.html">放假...</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-03-26.html">ACM校赛水题组酱油记</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span> - <span class="right" id="">2016-01-25/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span> + <span class="right" id="">2016-03-26/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-16.html">QMidiPlayer Progress-2016-01-16</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-18.html">Cross Noodles Recooked</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span> - <span class="right" id="">2016-01-16/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #js #webgl</span> + <span class="right" id="">2016-02-18/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-03.html">The Design and The Real Product</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-02-14.html">Why Do I Prefer a Computer over a Girlfriend/<s>(Boyfriend)</s></a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #design</span> - <span class="right" id="">2016-01-03/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry</span> + <span class="right" id="">2016-02-14/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-27.html">QMidiPlayer got its repo</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-25.html">放假...</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span> - <span class="right" id="">2015-12-27/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span> + <span class="right" id="">2016-01-25/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-23.html">Chris' First Development Blog</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-16.html">QMidiPlayer Progress-2016-01-16</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel</span> - <span class="right" id="">2015-12-23/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span> + <span class="right" id="">2016-01-16/2018-10-11</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/9.html b/blog/list/9.html index 50383ea..22f4a82 100644 --- a/blog/list/9.html +++ b/blog/list/9.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,30 +47,30 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-20.html">忙</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-01-03.html">The Design and The Real Product</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span> - <span class="right" id="">2015-12-20/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #design</span> + <span class="right" id="">2016-01-03/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-22.html">Raspberry Pi2 初体验</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-27.html">QMidiPlayer got its repo</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#hands-on #device-review</span> - <span class="right" id="">2015-11-22/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer</span> + <span class="right" id="">2015-12-27/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-01.html">Hackathon 2015乱搞记</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-23.html">Chris' First Development Blog</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span> - <span class="right" id="">2015-11-01/2015-11-22</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel</span> + <span class="right" id="">2015-12-23/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-31.html">大学入学两个月了……</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-12-20.html">忙</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> - <span class="right" id="">2015-10-31/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span> + <span class="right" id="">2015-12-20/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-10-30.html">First CCPC sightseeing tour</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2015-11-22.html">Raspberry Pi2 初体验</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest</span> - <span class="right" id="">2015-10-30/2018-10-11</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#hands-on #device-review</span> + <span class="right" id="">2015-11-22/2018-10-11</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/acmicpc/0.html b/blog/list/acmicpc/0.html index a89d8ad..bb3d558 100644 --- a/blog/list/acmicpc/0.html +++ b/blog/list/acmicpc/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a class="active" href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a class="active" href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -82,7 +50,7 @@ loadTheme(); <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-08.html">Respecting your job</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage #acmicpc</span> - <span class="right" id="">2018-05-08/2019-02-13</span></div> + <span class="right" id="">2018-05-08/2019-02-12</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-04-22.html">ICPC类比赛中计算几何问题之「乱象」</a></h3> <br> @@ -92,7 +60,7 @@ loadTheme(); <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-05-08.html">2017省赛流水帐</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span> - <span class="right" id="">2017-05-08/2019-02-13</span></div> + <span class="right" id="">2017-05-08/2019-02-12</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-03-26.html">ACM校赛水题组酱油记</a></h3> <br> diff --git a/blog/list/c++/0.html b/blog/list/c++/0.html index 3e894bd..e5affa2 100644 --- a/blog/list/c++/0.html +++ b/blog/list/c++/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a class="active" href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a class="active" href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/computer-repairing/0.html b/blog/list/computer-repairing/0.html index 08d7df5..65a10b3 100644 --- a/blog/list/computer-repairing/0.html +++ b/blog/list/computer-repairing/0.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a class="active" href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a class="active" href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/contest/0.html b/blog/list/contest/0.html index d84e8b2..37683a3 100644 --- a/blog/list/contest/0.html +++ b/blog/list/contest/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a class="active" href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a class="active" href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -82,7 +50,7 @@ loadTheme(); <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-05-08.html">2017省赛流水帐</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#contest #acmicpc</span> - <span class="right" id="">2017-05-08/2019-02-13</span></div> + <span class="right" id="">2017-05-08/2019-02-12</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2016-03-26.html">ACM校赛水题组酱油记</a></h3> <br> diff --git a/blog/list/daily-life/0.html b/blog/list/daily-life/0.html index 46d9e60..c648d2f 100644 --- a/blog/list/daily-life/0.html +++ b/blog/list/daily-life/0.html @@ -1,4 +1,4 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a class="active" href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a class="active" href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/daily-life/1.html b/blog/list/daily-life/1.html index 06f82be..fe1f4f0 100644 --- a/blog/list/daily-life/1.html +++ b/blog/list/daily-life/1.html @@ -1,4 +1,4 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a class="active" href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a class="active" href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/design/0.html b/blog/list/design/0.html index 293d18e..38bd786 100644 --- a/blog/list/design/0.html +++ b/blog/list/design/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a class="active" href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a class="active" href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/devel/0.html b/blog/list/devel/0.html index 34bccd8..0dc9c89 100644 --- a/blog/list/devel/0.html +++ b/blog/list/devel/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a class="active" href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a class="active" href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/devel/1.html b/blog/list/devel/1.html index a0ff8bd..7594161 100644 --- a/blog/list/devel/1.html +++ b/blog/list/devel/1.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a class="active" href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a class="active" href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/device-review/0.html b/blog/list/device-review/0.html index fd3c693..353dc4b 100644 --- a/blog/list/device-review/0.html +++ b/blog/list/device-review/0.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a class="active" href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a class="active" href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -65,7 +65,7 @@ function ol() <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2020-11-20.html">EDIROL SD-80: The Adventure Continues</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music</span> - <span class="right" id="">2020-11-20/2022-07-01</span></div> + <span class="right" id="">2020-11-20/2024-02-11</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-04-25.html">EDIROL SD-80: A Trapped Beast</a></h3> <br> diff --git a/blog/list/device-review/1.html b/blog/list/device-review/1.html index 8e2a236..0bd80bd 100644 --- a/blog/list/device-review/1.html +++ b/blog/list/device-review/1.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a class="active" href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a class="active" href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/electronics/0.html b/blog/list/electronics/0.html new file mode 100644 index 0000000..ed4cef4 --- /dev/null +++ b/blog/list/electronics/0.html @@ -0,0 +1,76 @@ +<!DOCTYPE html><html><head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<meta name="theme-color" content="#000000"> +<title>Chrisoft::Blog</title> +<script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> +<link rel="stylesheet" type="text/css" href="/common.css"> +<link rel="stylesheet" type="text/css" href="/panel.css"> +<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> +<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b"> +<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a"> +<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b"> +<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a"> +<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b"> +<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a"> +<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b"> +<link rel="stylesheet" type="text/css" href="/blog/blogext.css"> +<script> +function ol() +{ + window.onresize=function() + { + if(window.innerWidth<768) + setupevents(); + else unsetevents(); + } + window.onresize(); + loadTheme(); +} +</script> +</head> +<body onload="ol()" style="overflow-x:hidden;"> + <div id="panel" class="TText"> + <ul id="panellist"> + <li><a href="/"><h1>Chrisoft</h1></a></li> + <li><a href="/blog"><h2>Blog</h2></a></li> + <li><span>Tags filter</span> + <ul id="tagslist"> + + + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + </li> + </ul> + </div> + <div id="content"> + <div id="postslist"> + + <div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2024-02-04.html">RBUS-ADAT devlog</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #electronics</span> + <span class="right" id="">2024-02-04/2024-02-17</span></div> + </div><div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2024-02-02.html">R-BUS Technical Information</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #electronics</span> + <span class="right" id="">2024-02-02/2024-02-13</span></div> + </div></div> + <div id="insanch" style="height:5em;"></div> + <div id="footer"> + <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;"> + <span style="display:table-cell;"><a id="prepage" href="#"><<</a></span> + <span style="text-align:center;display:table-cell;" id="page">1/1</span> + <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">>></a></span> + </div> + <div style="text-align:center;" class="TText"> + Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5 + <br> + Content licensed under CC BY-SA 4.0. + </div> + </div> + </div> + + +</body></html>
\ No newline at end of file diff --git a/blog/list/electronics/index.html b/blog/list/electronics/index.html new file mode 120000 index 0000000..359ee56 --- /dev/null +++ b/blog/list/electronics/index.html @@ -0,0 +1 @@ +0.html
\ No newline at end of file diff --git a/blog/list/garbage/0.html b/blog/list/garbage/0.html index fa71103..7e6a8e4 100644 --- a/blog/list/garbage/0.html +++ b/blog/list/garbage/0.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -52,16 +52,16 @@ function ol() <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> <span class="right" id="">2016-02-13/2018-10-11</span></div> </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2022-12-10.html">GEESE</a></h3> - <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span> - <span class="right" id="">2022-12-10/2022-12-10</span></div> - </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2021-06-03.html">No, I'm not dead</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> <span class="right" id="">2021-06-03/2021-06-02</span></div> </div><div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-06-24.html">Working as an intern for "the spyware corporation"</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #sophistry</span> + <span class="right" id="">2019-06-24/2024-02-17</span></div> + </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-02-13.html">Site Revamp and Other Rants -- 2019 Edition</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp #garbage</span> diff --git a/blog/list/garbage/1.html b/blog/list/garbage/1.html index 50a61b8..84ea768 100644 --- a/blog/list/garbage/1.html +++ b/blog/list/garbage/1.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/garbage/2.html b/blog/list/garbage/2.html index 100e469..ad92037 100644 --- a/blog/list/garbage/2.html +++ b/blog/list/garbage/2.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/garbage/3.html b/blog/list/garbage/3.html index 89c736b..c77388c 100644 --- a/blog/list/garbage/3.html +++ b/blog/list/garbage/3.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a class="active" href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/hands-on/0.html b/blog/list/hands-on/0.html index 4d0f64a..0cd9700 100644 --- a/blog/list/hands-on/0.html +++ b/blog/list/hands-on/0.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a class="active" href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a class="active" href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/interactive/0.html b/blog/list/interactive/0.html index 23d5329..81a0a2c 100644 --- a/blog/list/interactive/0.html +++ b/blog/list/interactive/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a class="active" href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a class="active" href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -82,7 +50,7 @@ loadTheme(); <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-05-03.html">Are you an Apple fanboy/fangirl?</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #interactive</span> - <span class="right" id="">2018-05-03/2019-02-10</span></div> + <span class="right" id="">2018-05-03/2019-02-09</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/js/0.html b/blog/list/js/0.html index c1b5cdc..c5ebfe2 100644 --- a/blog/list/js/0.html +++ b/blog/list/js/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a class="active" href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a class="active" href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/linux/0.html b/blog/list/linux/0.html index 0cd1d65..b2251b1 100644 --- a/blog/list/linux/0.html +++ b/blog/list/linux/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a class="active" href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a class="active" href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/midi/0.html b/blog/list/midi/0.html index a75f17e..afde4fe 100644 --- a/blog/list/midi/0.html +++ b/blog/list/midi/0.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a class="active" href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a class="active" href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -60,7 +60,7 @@ function ol() <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2020-11-20.html">EDIROL SD-80: The Adventure Continues</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music</span> - <span class="right" id="">2020-11-20/2022-07-01</span></div> + <span class="right" id="">2020-11-20/2024-02-11</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-04-25.html">EDIROL SD-80: A Trapped Beast</a></h3> <br> diff --git a/blog/list/music/0.html b/blog/list/music/0.html index f514079..50f553f 100644 --- a/blog/list/music/0.html +++ b/blog/list/music/0.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a class="active" href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a class="active" href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,6 +47,16 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2024-02-04.html">RBUS-ADAT devlog</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #electronics</span> + <span class="right" id="">2024-02-04/2024-02-17</span></div> + </div><div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2024-02-02.html">R-BUS Technical Information</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #electronics</span> + <span class="right" id="">2024-02-02/2024-02-13</span></div> + </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2022-11-27.html">(Not really) Musical Answers & Rants</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #midi</span> @@ -60,24 +70,14 @@ function ol() <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2020-11-20.html">EDIROL SD-80: The Adventure Continues</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music</span> - <span class="right" id="">2020-11-20/2022-07-01</span></div> - </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-04-25.html">EDIROL SD-80: A Trapped Beast</a></h3> - <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music #hands-on</span> - <span class="right" id="">2019-04-25/2022-06-30</span></div> - </div><div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-11-25.html">A short post on Cakewalk's death and my music production</a></h3> - <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #garbage</span> - <span class="right" id="">2017-11-25/2018-10-11</span></div> + <span class="right" id="">2020-11-20/2024-02-11</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;"> <span style="display:table-cell;"><a id="prepage" href="#"><<</a></span> - <span style="text-align:center;display:table-cell;" id="page">1/1</span> - <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">>></a></span> + <span style="text-align:center;display:table-cell;" id="page">1/2</span> + <span style="text-align:right;display:table-cell;"><a id="nexpage" href="/blog/list/music/1.html">>></a></span> </div> <div style="text-align:center;" class="TText"> Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5 diff --git a/blog/list/music/1.html b/blog/list/music/1.html new file mode 100644 index 0000000..ea8ebe8 --- /dev/null +++ b/blog/list/music/1.html @@ -0,0 +1,76 @@ +<!DOCTYPE html><html><head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<meta name="theme-color" content="#000000"> +<title>Chrisoft::Blog</title> +<script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> +<link rel="stylesheet" type="text/css" href="/common.css"> +<link rel="stylesheet" type="text/css" href="/panel.css"> +<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> +<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b"> +<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a"> +<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b"> +<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a"> +<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b"> +<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a"> +<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b"> +<link rel="stylesheet" type="text/css" href="/blog/blogext.css"> +<script> +function ol() +{ + window.onresize=function() + { + if(window.innerWidth<768) + setupevents(); + else unsetevents(); + } + window.onresize(); + loadTheme(); +} +</script> +</head> +<body onload="ol()" style="overflow-x:hidden;"> + <div id="panel" class="TText"> + <ul id="panellist"> + <li><a href="/"><h1>Chrisoft</h1></a></li> + <li><a href="/blog"><h2>Blog</h2></a></li> + <li><span>Tags filter</span> + <ul id="tagslist"> + + + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a class="active" href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + </li> + </ul> + </div> + <div id="content"> + <div id="postslist"> + + <div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-04-25.html">EDIROL SD-80: A Trapped Beast</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#device-review #midi #music #hands-on</span> + <span class="right" id="">2019-04-25/2022-06-30</span></div> + </div><div class="block TText" id="" style="display:block;"> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2017-11-25.html">A short post on Cakewalk's death and my music production</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#music #garbage</span> + <span class="right" id="">2017-11-25/2018-10-11</span></div> + </div></div> + <div id="insanch" style="height:5em;"></div> + <div id="footer"> + <div id="pagesw" class="TText" style="display:table;width:100%;padding:1em 0;"> + <span style="display:table-cell;"><a id="prepage" href="/blog/list/music/0.html"><<</a></span> + <span style="text-align:center;display:table-cell;" id="page">2/2</span> + <span style="text-align:right;display:table-cell;"><a id="nexpage" href="#">>></a></span> + </div> + <div style="text-align:center;" class="TText"> + Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5 + <br> + Content licensed under CC BY-SA 4.0. + </div> + </div> + </div> + + +</body></html>
\ No newline at end of file diff --git a/blog/list/opengl/0.html b/blog/list/opengl/0.html index 00700a2..6daff87 100644 --- a/blog/list/opengl/0.html +++ b/blog/list/opengl/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a class="active" href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a class="active" href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/qmidiplayer/0.html b/blog/list/qmidiplayer/0.html index 9b8b0f3..85f4060 100644 --- a/blog/list/qmidiplayer/0.html +++ b/blog/list/qmidiplayer/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a class="active" href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a class="active" href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/qt/0.html b/blog/list/qt/0.html index 813db07..30711fb 100644 --- a/blog/list/qt/0.html +++ b/blog/list/qt/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a class="active" href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a class="active" href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/random-xp/0.html b/blog/list/random-xp/0.html index 23d9b11..c61a36b 100644 --- a/blog/list/random-xp/0.html +++ b/blog/list/random-xp/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a class="active" href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a class="active" href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -82,7 +50,7 @@ loadTheme(); <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-02-13.html">Site Revamp and Other Rants -- 2019 Edition</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp #garbage</span> - <span class="right" id="">2019-02-13/2019-07-25</span></div> + <span class="right" id="">2019-02-13/2019-07-24</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-01-05.html">Now using reverse proxy to deliver content</a></h3> <br> diff --git a/blog/list/sophistry/0.html b/blog/list/sophistry/0.html index 1d7f3d1..c4b2369 100644 --- a/blog/list/sophistry/0.html +++ b/blog/list/sophistry/0.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a class="active" href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a class="active" href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -47,10 +47,10 @@ function ol() <div id="postslist"> <div class="block TText" id="" style="display:block;"> - <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2022-12-10.html">GEESE</a></h3> + <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-06-24.html">Working as an intern for "the spyware corporation"</a></h3> <br> - <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span> - <span class="right" id="">2022-12-10/2022-12-10</span></div> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage #sophistry</span> + <span class="right" id="">2019-06-24/2024-02-17</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-06-07.html">Should this site still be alive by 2035...</a></h3> <br> diff --git a/blog/list/sophistry/1.html b/blog/list/sophistry/1.html index b7cdc7b..4a3d391 100644 --- a/blog/list/sophistry/1.html +++ b/blog/list/sophistry/1.html @@ -39,7 +39,7 @@ function ol() <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a class="active" href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a class="active" href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/list/special-page/0.html b/blog/list/special-page/0.html index cdda9cb..17a7811 100644 --- a/blog/list/special-page/0.html +++ b/blog/list/special-page/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a class="active" href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a class="active" href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -82,7 +50,7 @@ loadTheme(); <h3 style="line-height:1.5em;"><a id="" href="/blog/post/Privacy.html">Privacy Policy & Terms</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#special-page</span> - <span class="right" id="">2019-09-03/2019-09-04</span></div> + <span class="right" id="">2019-09-03/2019-09-03</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/web/0.html b/blog/list/web/0.html index 8828be7..2ee2c68 100644 --- a/blog/list/web/0.html +++ b/blog/list/web/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a class="active" href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a class="active" href="/blog/list/web">web</a></li><li id=""><a href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> @@ -82,12 +50,12 @@ loadTheme(); <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-09-04.html">September 2019 Site Update</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web</span> - <span class="right" id="">2019-09-04/2019-11-13</span></div> + <span class="right" id="">2019-09-04/2019-11-12</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2019-02-13.html">Site Revamp and Other Rants -- 2019 Edition</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#web #random-xp #garbage</span> - <span class="right" id="">2019-02-13/2019-07-25</span></div> + <span class="right" id="">2019-02-13/2019-07-24</span></div> </div><div class="block TText" id="" style="display:block;"> <h3 style="line-height:1.5em;"><a id="" href="/blog/post/2018-10-11.html">The stupid blogging system evolved!</a></h3> <br> diff --git a/blog/list/webgl/0.html b/blog/list/webgl/0.html index 2704318..28bf88d 100644 --- a/blog/list/webgl/0.html +++ b/blog/list/webgl/0.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <link rel="stylesheet" type="text/css" href="/common.css"> <link rel="stylesheet" type="text/css" href="/panel.css"> <link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> @@ -25,41 +26,8 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -71,7 +39,7 @@ loadTheme(); <ul id="tagslist"> - <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a class="active" href="/blog/list/webgl">webgl</a></li></ul> + <li id=""><a href="/blog/list/acmicpc">acmicpc</a></li><li id=""><a href="/blog/list/c++">c++</a></li><li id=""><a href="/blog/list/computer-repairing">computer-repairing</a></li><li id=""><a href="/blog/list/contest">contest</a></li><li id=""><a href="/blog/list/daily-life">daily-life</a></li><li id=""><a href="/blog/list/design">design</a></li><li id=""><a href="/blog/list/devel">devel</a></li><li id=""><a href="/blog/list/device-review">device-review</a></li><li id=""><a href="/blog/list/electronics">electronics</a></li><li id=""><a href="/blog/list/garbage">garbage</a></li><li id=""><a href="/blog/list/hands-on">hands-on</a></li><li id=""><a href="/blog/list/interactive">interactive</a></li><li id=""><a href="/blog/list/js">js</a></li><li id=""><a href="/blog/list/linux">linux</a></li><li id=""><a href="/blog/list/midi">midi</a></li><li id=""><a href="/blog/list/music">music</a></li><li id=""><a href="/blog/list/opengl">opengl</a></li><li id=""><a href="/blog/list/qmidiplayer">qmidiplayer</a></li><li id=""><a href="/blog/list/qt">qt</a></li><li id=""><a href="/blog/list/random-xp">random-xp</a></li><li id=""><a href="/blog/list/sophistry">sophistry</a></li><li id=""><a href="/blog/list/special-page">special-page</a></li><li id=""><a href="/blog/list/web">web</a></li><li id=""><a class="active" href="/blog/list/webgl">webgl</a></li></ul> </li> </ul> </div> diff --git a/blog/post/2014-11-14.html b/blog/post/2014-11-14.html index 1aeea18..54e796d 100644 --- a/blog/post/2014-11-14.html +++ b/blog/post/2014-11-14.html @@ -1,4 +1,4 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> @@ -61,18 +61,33 @@ function ol() <hr><div id="article" class="TText"><article> <h2 id="tocanch0" class="tvis">转写前言</h2> <p>看到此篇日期比这个博客系统诞生还早的文章的你请不要恐慌。这是我高中三年级写的一篇沙雕文章。原文以我的除自己之外无人可以辨认的手写体记录于高中考试时所发的草稿纸上。今天(2021年6月26日)转写出来,供世人鄙视。</p> -<p>(为了免去各位识别我的手写体的痛苦,在此不会发布扫描版。请相信我的转写是 100% 准确的)</p> +<p>(为了免去各位识别我的手写体的痛苦,在此不会发布扫描版。请相信我的转写是 +100% 准确的)</p> <h2 id="tocanch1" class="tvis">正文</h2> <p>喷当代中国大陆的“考场作文”制度</p> <p>浅显的中国历史我们都学过。教科书上说什么“八股取士”是一种怎么怎么样的做法(诸如钳制思想,阻碍人类发展之类,我早就还给我可亲可敬的历史老师了)。那么,现在我的观点是:现代中国大陆的考场作文制度毒害人的程度,比八股取士什么玩意儿的深十倍乃至百倍!</p> -<p>写得一手好文章,原是一件好事,在许多方面都有用的。但是,对于像我这样的,编一篇考场作文比便秘拉不出 (bi——) 还困难的人来说,写那种东西基本就是对我们的残害了。拿到作文题目,搜肠刮肚完还不知道如何去作的时候,已经十分惆怅了。然而,还有人追在你屁股后面,要你拉出来的 (bi——)!(这个比喻一点儿也不失当,因为这样憋出来的作文往往跟 (bi——) 一样臭)。便秘了还要逼人家拉出来,这是一种多么不人道的行为!肠在这种摧残之下,尚有发生直肠癌的可能性,而我们的榆木脑袋……</p> -<p>好好好!你说写这种东西对我们有好处,那我们来看看到底有什么好处!我们来随便看几篇“考场佳作”的题目:什么“熄灭蜡烛,莫惊扰美”,什么“心有猛虎,细嗅蔷薇”,什么“纸梯”,超浓的“文学气息”,一看就不是实用的文章。(我不是故意挑的——因为那本书上可以找到的题目全都这样…)那么,这种题目,善于写作的人写出来,叫“美文”;我这号人写出来,必然就是 (bi——) 了。将来,善于写作的人从办公室里出来,可以写上两篇作为娱乐,陶冶身心。而我扫完大街回窝之后还要玩上一次便秘?!别开玩笑了!我不是 masochist (受虐狂)!再者,我还要为我仅剩的一点大脑负责呢!</p> -<p>那么又有人说话了(我妈就是其中的一位):“这对你将来写论文还有用处哩!”我对此实在无话可说。那么假设有万分之一的可能性,我高中毕业没去扫大街,还考上了名校——石油大学,我该写论文了。然后我的论文落笔一个“人生如梦,年华似雪”,抬笔又是“自然而缓慢的优雅的成长”…… (bi————————)! Pardon my French (对不起我爆粗了)!便秘的事就不用提了,因为光想象一下论文里要出现这种东西就得让我恶心上一个小时!</p> +<p>写得一手好文章,原是一件好事,在许多方面都有用的。但是,对于像我这样的,编一篇考场作文比便秘拉不出 +(bi——) +还困难的人来说,写那种东西基本就是对我们的残害了。拿到作文题目,搜肠刮肚完还不知道如何去作的时候,已经十分惆怅了。然而,还有人追在你屁股后面,要你拉出来的 +(bi——)!(这个比喻一点儿也不失当,因为这样憋出来的作文往往跟 (bi——) +一样臭)。便秘了还要逼人家拉出来,这是一种多么不人道的行为!肠在这种摧残之下,尚有发生直肠癌的可能性,而我们的榆木脑袋……</p> +<p>好好好!你说写这种东西对我们有好处,那我们来看看到底有什么好处!我们来随便看几篇“考场佳作”的题目:什么“熄灭蜡烛,莫惊扰美”,什么“心有猛虎,细嗅蔷薇”,什么“纸梯”,超浓的“文学气息”,一看就不是实用的文章。(我不是故意挑的——因为那本书上可以找到的题目全都这样…)那么,这种题目,善于写作的人写出来,叫“美文”;我这号人写出来,必然就是 +(bi——) +了。将来,善于写作的人从办公室里出来,可以写上两篇作为娱乐,陶冶身心。而我扫完大街回窝之后还要玩上一次便秘?!别开玩笑了!我不是 +masochist (受虐狂)!再者,我还要为我仅剩的一点大脑负责呢!</p> +<p>那么又有人说话了(我妈就是其中的一位):“这对你将来写论文还有用处哩!”我对此实在无话可说。那么假设有万分之一的可能性,我高中毕业没去扫大街,还考上了名校——石油大学,我该写论文了。然后我的论文落笔一个“人生如梦,年华似雪”,抬笔又是“自然而缓慢的优雅的成长”…… +(bi————————)! Pardon my French +(对不起我爆粗了)!便秘的事就不用提了,因为光想象一下论文里要出现这种东西就得让我恶心上一个小时!</p> <p>如果你同意以上我的观点,你现在应该同意考场作文对我这样的废物一点儿好处也没有了。(如果你认为我还有救,那一定是因为你没救了。)那么为什么我要说这东西对普天下都有害呢?下面我就要喷喷这制度了。</p> -<p>警告:以下内容有一定的政治倾向。共产主义的<ruby>拥护者<rp>(</rp><rt>sǐ dǎng</rt><rp>)</rp></ruby>们,为了保持你们高贵的贞操,以及确保你们不被当作政治犯处理掉,我建议你们立即停止阅读并重新读一遍《共产党宣言》或《毛选》。(其实我的政治倾向还是很温和的,我既不认为共产主义阻碍人类发展,也不认为“西方国家”就是一肚子坏水。我只是不想被跨省而已……不要来抓我啊!)</p> +<p>警告:以下内容有一定的政治倾向。共产主义的<ruby>拥护者<rp>(</rp><rt>sǐ +dǎng</rt><rp>)</rp></ruby>们,为了保持你们高贵的贞操,以及确保你们不被当作政治犯处理掉,我建议你们立即停止阅读并重新读一遍《共产党宣言》或《毛选》。(其实我的政治倾向还是很温和的,我既不认为共产主义阻碍人类发展,也不认为“西方国家”就是一肚子坏水。我只是不想被跨省而已……不要来抓我啊!)</p> <p>首先,最为可恨的一点,是每道作文题目必有的“自定立意”。第一次我看到这四个字,欣喜若狂,以为就可以把自己扫遍全天下大街大志表达出来了。殊不知有人已经在背后把立意分了三六九等,而我这个恰好处在下下等,发下来一看,20分!</p> -<p>那么我是这玩意儿的受害者,有没有受益者呢?有!有些极度狡猾圆润的人,敏锐地捕捉到了一个事实:出题人和批卷人似乎总是坚定的共产党员。于是他们想尽一切办法讨好党。再加上最近时事紧张,他们更有的可写了:把日本和德国拿出来对比,或者“西方国家鼓吹‘中国威胁论’”,预计不久之后还会有一批宣传社会主义核心价值观的。这是什么玩意儿?潜伏在身边的地下党员么?!另外,马克思的“高考”作文题目是“青年在选择职业时的考虑”,他们的觉悟已经超越马克思啦!这 (bi——) 深藏功与名啊!(顺便,我听说老金一家三个都在这个年纪写过很高端的东西……)</p> -<p>与此相比,英语作文就开明得多(或许是考虑到我们英语水平太低的缘故)。要写“十年后的我”,我就写我十年后扫大街,居无定所,饥一顿饱一顿,这还得了 80% 的分。这种东西上了语文考场作文,估计直接就零分啦!可今年某省的高考作文还要人大谈“大学的门与路”。故意歧视我们这些没学上的学渣是不是!这种出题人,就该让他们在全省乃至全国学渣的口水中淹死!</p> +<p>那么我是这玩意儿的受害者,有没有受益者呢?有!有些极度狡猾圆润的人,敏锐地捕捉到了一个事实:出题人和批卷人似乎总是坚定的共产党员。于是他们想尽一切办法讨好党。再加上最近时事紧张,他们更有的可写了:把日本和德国拿出来对比,或者“西方国家鼓吹‘中国威胁论’”,预计不久之后还会有一批宣传社会主义核心价值观的。这是什么玩意儿?潜伏在身边的地下党员么?!另外,马克思的“高考”作文题目是“青年在选择职业时的考虑”,他们的觉悟已经超越马克思啦!这 +(bi——) +深藏功与名啊!(顺便,我听说老金一家三个都在这个年纪写过很高端的东西……)</p> +<p>与此相比,英语作文就开明得多(或许是考虑到我们英语水平太低的缘故)。要写“十年后的我”,我就写我十年后扫大街,居无定所,饥一顿饱一顿,这还得了 +80% +的分。这种东西上了语文考场作文,估计直接就零分啦!可今年某省的高考作文还要人大谈“大学的门与路”。故意歧视我们这些没学上的学渣是不是!这种出题人,就该让他们在全省乃至全国学渣的口水中淹死!</p> <p>嘛,我差不多喷完了。在此我特地公布一下前段时间我做的一个调查的结果。问题是:“你认为现在所写的语文考场作文,对你的将来……”调查的对象是本校本年级学生45名,其中不乏作文常被当作范文的。没有人选择“非常有用”或“不知道”,而选择“有一定用处”和“完全没用”的人数比大约为1:2——和我的预测基本相同。从此我们至少可以看出一点问题。但我们伟大的出题人们还在命这种题:“贴近社会生活,有人文气息,让考生有话说”。这种题,让我这种学渣有什么话说!</p> <p>*注:本文引用的“考场佳作”,均来自《步步高大一轮复习讲义语文新课标》及万能的一中语文组所编的《语文天地》。</p> <p>Chris Xiong</p> @@ -81,11 +96,20 @@ function ol() <p>文中提到的英语作文一事,是确有其事的。某种程度上是为写本文故意做的一次试验。</p> <p>文中提到的调查是存在的。不过调查对象全都是理科生(文科生当时和我们不在同一座教学楼里),结果自然是自动偏向对我的结论有利的。</p> <p>文中充满着我高中时代典型的自嘲。如果你看了本文的纸质版,你会感到(当时的)我对这种考场作文的痛恨从纸上渗出来(转写到屏幕上之后这种效果虽然有所减弱,但从标点符号和语言的使用上还是能看出一些来的——虽然什么东西从屏幕上渗出来听起来有些奇怪)。这种痛恨是如此的强烈,以至于我高中几乎没有写过一篇严肃的考场作文。大部分写出来的,都是用来气老师的。如此一来即使我不写作文作业,或者模拟考试答题纸作文面直接空白,老师也不会找我的麻烦——既免去我写作文的痛苦,又免去老师读我写的东西的折磨,真是两全其美。</p> -<p>要是说高中从不练习写作如今有没有什么后悔之处,那么我 GRE 的作文不过关可以说勉强算是一点。但 GRE 作文不像高考英语,CET或者托福英语。后者考的是语言使用能力,而 GRE 考查的是思辨能力。所以从这个角度讲,就算我的高中语文考场作文次次满分, GRE 作文估计也达不到一半人的水平,那么也没有什么可后悔的地方了。</p> -<p>举个随便编的例子来说, GRE 的作文题目可能是这样的:当地政府人员宣布了一项计划,计划在本地的河上建造一座水库。并且声称由于甲、乙、丙原因,水库建造后当地的居民人均寿命可以翻 10 倍。要求答题者分析政府的主张是否存在漏洞(当然是有的)。</p> +<p>要是说高中从不练习写作如今有没有什么后悔之处,那么我 GRE +的作文不过关可以说勉强算是一点。但 GRE +作文不像高考英语,CET或者托福英语。后者考的是语言使用能力,而 GRE +考查的是思辨能力。所以从这个角度讲,就算我的高中语文考场作文次次满分, +GRE 作文估计也达不到一半人的水平,那么也没有什么可后悔的地方了。</p> +<p>举个随便编的例子来说, GRE +的作文题目可能是这样的:当地政府人员宣布了一项计划,计划在本地的河上建造一座水库。并且声称由于甲、乙、丙原因,水库建造后当地的居民人均寿命可以翻 +10 倍。要求答题者分析政府的主张是否存在漏洞(当然是有的)。</p> <p>而中国的高考作文考的是什么?似乎首要是学生的政治“觉悟”,其次是使用华丽词句的能力。前者加上近年来越来越红的作文题目(见我2018年与山东考生一起写的高考作文(<a href="/blog/post/2018-06-07.html">链接</a>)),让人不得不怀疑考场作文成了灌输特定价值观的工具。至于使用华丽词句的能力,我想也许不是所有人都需要的吧。朴实无华的文字,只要传递了作者想要表达的信息,也就达到了目的;华丽的辞藻,反倒可能提高阅读的门槛,即便要表达的思想是如何卓越,也许也无法为大众所接受。</p> <p>思辨(或者称为批判性思维)能力,至少让人在与人争论时能够发现对方是否存在逻辑上的漏洞和谬误,并且可以帮助自己避免类似的错误。而对固定价值观的灌输,则恰恰相反:让人不问一切地接受得到的信息,成为容易上当受骗的天真幼稚之人。这两种教育方式,高下立判。</p> -<p>如果你认为我在对我的“美国主子”表忠心,那你就错了。请不要忘记 GRE 是研究生水平的考试。在研究生考试考如此水平的思辨,还是太晚了。不然的话美国也不会有如此大数量的疫苗反对者 (anti-vaxxer) 或者地平说支持者 (flat earther)。我认为基本的思辨能力应该放在基础教育阶段。那样至少可以减少一些所谓保健品的诈骗案的数量。</p> +<p>如果你认为我在对我的“美国主子”表忠心,那你就错了。请不要忘记 GRE +是研究生水平的考试。在研究生考试考如此水平的思辨,还是太晚了。不然的话美国也不会有如此大数量的疫苗反对者 +(anti-vaxxer) 或者地平说支持者 (flat +earther)。我认为基本的思辨能力应该放在基础教育阶段。那样至少可以减少一些所谓保健品的诈骗案的数量。</p> <p>阁下看到这里,心里的感觉若是“哇这人他写了些什么我怎么什么都看不懂”,那确实怪不得阁下。表达能力低下大概是我另一个略微后悔高中从不写作文的地方。这种表达能力的低下,是跨越语言的——可能有人读到我的英文博客文章,感觉还相对通顺,但并不知道背后是经过我自己好多遍审阅改写才成为最终版本的。很多时候脑中根本无法组织用来描述我的想法的语言,这时才后悔年轻的时候没有练习写作;但一想到当时练习写作就意味要着写违心的或者毫无营养文字,这种后悔就直接烟消云散了。</p> </article> </div><br><hr> diff --git a/blog/post/2015-10-29.html b/blog/post/2015-10-29.html index f6dd0a5..34ac28b 100644 --- a/blog/post/2015-10-29.html +++ b/blog/post/2015-10-29.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -83,7 +51,7 @@ loadTheme(); <ul id="tocroot"> </ul> </li> - <li style="margin-left:-0.5em"><a id="prevp">Prev post</a></li> + <li style="margin-left:-0.5em"><a id="prevp" href="2014-11-14.html">Prev post</a></li> <li style="margin-left:-0.5em"><a id="nextp" href="2015-10-30.html">Next post</a></li> </ul> </div> diff --git a/blog/post/2015-10-30.html b/blog/post/2015-10-30.html index 8329511..14db966 100644 --- a/blog/post/2015-10-30.html +++ b/blog/post/2015-10-30.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2015-10-31.html b/blog/post/2015-10-31.html index 0615a80..09fc138 100644 --- a/blog/post/2015-10-31.html +++ b/blog/post/2015-10-31.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2015-11-01.html b/blog/post/2015-11-01.html index e697372..f0f7f08 100644 --- a/blog/post/2015-11-01.html +++ b/blog/post/2015-11-01.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2015-11-22.html b/blog/post/2015-11-22.html index 5968642..ab9d44b 100644 --- a/blog/post/2015-11-22.html +++ b/blog/post/2015-11-22.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2015-12-20.html b/blog/post/2015-12-20.html index 840373e..57b2c02 100644 --- a/blog/post/2015-12-20.html +++ b/blog/post/2015-12-20.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2015-12-23.html b/blog/post/2015-12-23.html index 5f5b374..e34d3d2 100644 --- a/blog/post/2015-12-23.html +++ b/blog/post/2015-12-23.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2015-12-27.html b/blog/post/2015-12-27.html index e0f7515..6126cec 100644 --- a/blog/post/2015-12-27.html +++ b/blog/post/2015-12-27.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2016-01-03.html b/blog/post/2016-01-03.html index b60e695..191069c 100644 --- a/blog/post/2016-01-03.html +++ b/blog/post/2016-01-03.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2016-01-16.html b/blog/post/2016-01-16.html index 81d740e..e6c945f 100644 --- a/blog/post/2016-01-16.html +++ b/blog/post/2016-01-16.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2016-01-25.html b/blog/post/2016-01-25.html index c1d2542..c311c37 100644 --- a/blog/post/2016-01-25.html +++ b/blog/post/2016-01-25.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2016-02-14.html b/blog/post/2016-02-14.html index b47d4f1..b673fe5 100644 --- a/blog/post/2016-02-14.html +++ b/blog/post/2016-02-14.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2016-02-18.html b/blog/post/2016-02-18.html index 5d4f155..8cad5b8 100644 --- a/blog/post/2016-02-18.html +++ b/blog/post/2016-02-18.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2016-03-26.html b/blog/post/2016-03-26.html index 20be317..9216327 100644 --- a/blog/post/2016-03-26.html +++ b/blog/post/2016-03-26.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2016-04-09.html b/blog/post/2016-04-09.html index 56d4aea..9cda65b 100644 --- a/blog/post/2016-04-09.html +++ b/blog/post/2016-04-09.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,44 +31,15 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> -</head> +<style> +article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} +</style><style scoped=""> +ul{list-style-type:none;} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -92,9 +64,7 @@ loadTheme(); <div id="datetags" class="TText" style="margin-bottom:1em;">2016-04-09<br>#devel #qmidiplayer #midi</div> <hr><div id="article" class="TText"> <article> -<style> -article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} -</style> + <h2 id="tocanch0" class="tvis">Abstract</h2> <p> @@ -107,9 +77,7 @@ For the Chinese version, please visit <Chinese version link here>. <div style="text-align:center;"> <b>Contents</b> [<a href="#" onclick="var e=document.getElementById("toc");if(e.style.display=="block"){e.style.display="none";this.innerHTML="show";}else {e.style.display="block";this.innerHTML="hide";}">hide</a>] </div> -<style scoped=""> -ul{list-style-type:none;} -</style> + <ul style="font-size:0.9em;display:block;" id="toc"> <li>1 Data Representations <ul> diff --git a/blog/post/2016-05-12.html b/blog/post/2016-05-12.html index b2c9640..7c935ae 100644 --- a/blog/post/2016-05-12.html +++ b/blog/post/2016-05-12.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2016-06-21.html b/blog/post/2016-06-21.html index b3fea73..b8fbed3 100644 --- a/blog/post/2016-06-21.html +++ b/blog/post/2016-06-21.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,44 +31,13 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> -</head> +<style> +article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -162,9 +132,7 @@ Most posts are in Chinese... </li> </ul> </li></ul></div> -<style> -article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} -</style> + <h2 id="tocanch0" class="tvis">课程相关</h2> <p> 这个学期在我以为它还没开始多久的时候就要结束了。于是现在我来随便看看这学期都学了些什么…… @@ -493,7 +461,7 @@ SMELT其实最初是作为给BLR3用的一个hge的替代品出现的。也算 </p> <h3 id="tocanch26" class="tvis">神秘组织「BKT」</h3> <a id="n27" href="#note27" class="note">[27]</a> -<br><encrypted hint="The full name of BKT <br>with space stripped and <br>all letters in lowercase?" hash="454d2df9d1048b3fdd0d5c6799b834921432fce94b500ba16d057c10b0feea66" encont="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" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a> +<br><encrypted hint="The full name of BKT <br>with space stripped and <br>all letters in lowercase?" hash="454d2df9d1048b3fdd0d5c6799b834921432fce94b500ba16d057c10b0feea66" encont="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" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a> to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted><br> 一些额外的话 <a id="n28" href="#note28" class="note">[28]</a> @@ -532,7 +500,7 @@ to decrypt. <noscript>Note that you need have JavaScript enabled for decryption. <br><br> ……然后祝他们幸福。<a id="n30" href="#note30" class="note">[30]</a> <h3 id="tocanch28" class="tvis">宿舍和宿舍风气</h3> -<encrypted hint="请用基本拉丁字母输入我的<br>一个含一个希腊字母的网名" hash="39932de669f3e48d5fe22219188e19a02d45352fae101df1761e4014607566ae" encont="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" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a> +<encrypted hint="请用基本拉丁字母输入我的<br>一个含一个希腊字母的网名" hash="39932de669f3e48d5fe22219188e19a02d45352fae101df1761e4014607566ae" encont="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" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a> to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted> <h3 id="tocanch29" class="tvis">钱</h3> <p> @@ -547,7 +515,7 @@ to decrypt. <noscript>Note that you need have JavaScript enabled for decryption. 当然我感觉这些钱应该也算花在该花的地方了吧。 </p> <h3 id="tocanch30" class="tvis">关于我自己的健康状况</h3> -<encrypted hint="php?" hash="2cfe798301e9d0db91f3c012440cb773831244877ae799f260a69741ed1569f8" encont="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" enid="2">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(2)">here</a> +<encrypted hint="php?" hash="2cfe798301e9d0db91f3c012440cb773831244877ae799f260a69741ed1569f8" encont="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" enid="2">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(2)">here</a> to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted> <h3 id="tocanch31" class="tvis">技能树</h3> <p> diff --git a/blog/post/2016-09-24.html b/blog/post/2016-09-24.html index 0de4d43..3094dd9 100644 --- a/blog/post/2016-09-24.html +++ b/blog/post/2016-09-24.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2017-01-09.html b/blog/post/2017-01-09.html index 778124f..a46fb94 100644 --- a/blog/post/2017-01-09.html +++ b/blog/post/2017-01-09.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2017-01-18.html b/blog/post/2017-01-18.html index d42c03c..eeffb11 100644 --- a/blog/post/2017-01-18.html +++ b/blog/post/2017-01-18.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,44 +31,13 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> -</head> +<style> +article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -95,9 +65,7 @@ loadTheme(); <p> 从本学期开始,垃圾桶改为每学期一期。(目录消失啦,看左边吧。) </p> -<style> -article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} -</style> + <h2 id="tocanch0" class="tvis">课程相关</h2> <p> 都说文化课最重要……<a id="n1" href="#note1" class="note">[1]</a> @@ -322,7 +290,7 @@ Canonical自己雇来的、专门维护Compiz的Sam Spilsbury也离开了Canonic <p> 那个东西指的是「神秘组织」BKT。 </p> -<encrypted hint="和上次密码一样" hash="5ce53fdbcc6a1f7b63d9e104e9073ae213daac41ea86f4ec4462584322c51afe" encont="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" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a> +<encrypted hint="和上次密码一样" hash="5ce53fdbcc6a1f7b63d9e104e9073ae213daac41ea86f4ec4462584322c51afe" encont="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" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a> to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted> <h2 id="tocanch20" class="tvis">婊一婊辣鸡专科学校</h2> <p> @@ -400,7 +368,7 @@ to decrypt. <noscript>Note that you need have JavaScript enabled for decryption. 这大概是入学以来我第一次后悔来到这里。 </p> <h2 id="tocanch22" class="tvis">神秘内容</h2> -<encrypted hint="b******phi" hash="5be136371f1b6925c4ac672a7f31c9c327a3bededdc935d785c7004478053a47" encont="Lvt/LfQA64K8Q7m1EBseDcAlE8yDV3ctlZIBpJQ5achEZz9iQiKDf9gJTGOkAiQ2n82nF8AnyKg8eMVOQbCoFwiq6fsNt6kD32I7c+EMwcvbFhLvfN6ZyrOAzTzbCxAMtKtdVkiPQII9yvmANyer9MIe3MNSB5NTtQFMfzfhaProdeKUFQMRvcv4EbN43s9ig2TGkQ/ilmVp/NlxEYFvcWh/QXdczCnOzW6RhTvtMuyQFaSarfzNOGKxKpereTMVfyXGnuy5Lqb2YORhQoAe+2xLMZ66u9It1Tj+CPAhviN48oJGZzBjA7RegitAZ310LQp0oGtHZt+4Uj4ndsL8mL3kURqpzEtBlyVPHXZYf8qwmB232QZFsVZ4Wk2dcDKXeRfuJFfXbE+2EJDsiFng5ItXsg2cAQgrV3a294OV0+bd5QJx8nLSl0kWpk9SdlI3rf6heups6+IlGsCjfImcpdd6LzAHu7syoz3F0CeHD3bELh8jzupCa3MnpGMs/JikdOss+ryMJiScdFEU2i4z7yfHq26ZhpAkfya1+CMBZgvspESYg6LMXEzjCoEbx/ZwihMh0gUd9xGpr+HMN3mfgtfM2LM6NHdN/CDqvR0AX3ktAPKe6T57N46Z9GxFQsrng76kQaH/ygeawmCP8fQ18VEXhnmtOhLLcgrCbVhdt9N72MzBgqeEeGIEmZTcNu6vVGmrcdTHGh8SqWJGOs16TADbJrFPRhyVy13O7MWHJFa5ECmpDEoOSq2AzL5DlQk6oiItH9oUNWiBeALCg4gHqJrWx4Pi4vkVSZgBNgZNHWy/0soQ552pshofyvV1Esr+4g6JWQdQDyRGKgeK0I8EHcOhWSknGQ9fiTbEWhFzLMkWdTc30ZwxidOHiH2+koefTTv1dUysxLLVnf6ODzFd" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a> +<encrypted hint="b******phi" hash="5be136371f1b6925c4ac672a7f31c9c327a3bededdc935d785c7004478053a47" encont="X2LfQVVOwrIk0N8tzSzj3tz5+HFF0n/Z/kdDllYhJpcK9MeOE3/X0EqOkbsRhIWPI4FM8dsp49eU6Gxh4iZoTAnXh89ziCVpBj/fC9Ip+BgEWNpKIZRH2ZUS7JyroKe7rjLF6ylB3R/WiONI4erdlxlw7hli15jd4hFmGhLm5xs9ql7a16MXzAiRKYlMNi/ecCoI/k6c6/zont2igKo4VNwhwIvQCwq7E+W1P72vy+RS1YyAQRlwcdj3qw0huEv2i/v2pZD0cf2F9+hvCBobcmH+0N9bDZDANedgy0NIlcW3GVIOFCWRqiJZePPscycl/AlsuXLerTez49xEfPxCysOwY+4FDFPNiSraS48pzAro140fD3wyDXlb/ZeXdMZ8uNm3O/+0iJAE6VhrrXxGlztPFSznYgeLgbilQiVjWp0wy9c98VVcmqCEUMlTBnCElh83P0IMcJY1tv3ATgA7iglEC+WE1Ce3HQiBERWriyOc9P+615wHfOeJiGWpSu3jqMAalv3X1QCT9ke9yVWf+OOJ8bSCecrjpqzACr9v5LETRfxyDKEh3+uhnH1/UdVbBiJl0Jj+c8RPf8ll7z6tkAB0su2ZMbmdYTmq9u0rgAnuIHvstNICDaV31ZEr3jlm3xyHCi6Ixuf3C376vnkapZaUe7rMk06SCpk4+K6WR8fipdfSrSdVRTWM3ZJG0dJhg8Y17EQYq1Af+qp7MDLpnYyv+xpARCxGQ2Xa4NRHg3b3m0HhWds/w1Ge1NiNUGT/1Te9VyQnELvdimA4jLlbFehnTyz9BUQYB5WmPh/QJ9n54sXx7h4Jkh277R9rhpc9OPbb7tuXSO5FlGDYhS8hlB4YlF/kfEVBngjy3T9Q5eIcmYNvq+7EdxjTiq6LDwu5qF2TbrZ88vp813p2KBxP" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a> to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted> <h2 id="tocanch23" class="tvis">「技能树」</h2> <p> diff --git a/blog/post/2017-02-13.html b/blog/post/2017-02-13.html index a8904a1..041ad7b 100644 --- a/blog/post/2017-02-13.html +++ b/blog/post/2017-02-13.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2017-04-11.html b/blog/post/2017-04-11.html index 9d6fc84..6bb5472 100644 --- a/blog/post/2017-04-11.html +++ b/blog/post/2017-04-11.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2017-05-08.html b/blog/post/2017-05-08.html index 8931dc7..19c6880 100644 --- a/blog/post/2017-05-08.html +++ b/blog/post/2017-05-08.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2017-06-09.html b/blog/post/2017-06-09.html index a20e560..9914a8d 100644 --- a/blog/post/2017-06-09.html +++ b/blog/post/2017-06-09.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2017-06-29.html b/blog/post/2017-06-29.html index 4f5d1fc..0cf2418 100644 --- a/blog/post/2017-06-29.html +++ b/blog/post/2017-06-29.html @@ -1,4 +1,4 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> @@ -35,7 +35,9 @@ function ol() _decryptonload(); } </script> -</head> +<style> +article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -60,9 +62,7 @@ function ol() <div id="datetags" class="TText" style="margin-bottom:1em;">2017-06-29<br>#garbage #daily-life</div> <hr><div id="article" class="TText"> <article> -<style> -article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} -</style> + <h2 id="tocanch0" class="tvis">课程相关</h2> <s>于是这学期上了些什么课来着……</s> <ul> @@ -425,7 +425,7 @@ article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} <p> 这里是一些当时我混迹Ballance吧时的黑历史。 </p> -<encrypted hint="Type in the phrase "Yes, do as I say!" to read this section." hash="9bcd7c3417087e3b22a5105f91923551d465add76a4b8b043cdd9ad030efff9b" encont="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" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a> +<encrypted hint="Type in the phrase "Yes, do as I say!" to read this section." hash="9bcd7c3417087e3b22a5105f91923551d465add76a4b8b043cdd9ad030efff9b" encont="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" enid="0">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(0)">here</a> to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted> <h3 id="tocanch33" class="tvis">「实名制」</h3> <p> @@ -628,7 +628,7 @@ that millions of fools would beg to be jailed. <p> Broken pipe. </p> -<encrypted hint="Don't read it." hash="4d35086eef63234bf06581d1a11d4e6258ada0bda4e7fca62e6450251f74a650" encont="XEYqv08FzpVV0TD3zCHqVDBcjI+evdHu5FSev6OLJyXylkQ5fe3hPHPx6Wbxo3C4kvbrwy0F+G02aKu41tjuAEPu/ZPkeZ2V1CnRVE6FXgAzn1jfSqoiKWq/QYzTizh/IdavQQnQhgg6D4QRlZmeP7NJGoKCjffQpn4jptvEJDRLSoMzl3upV4xLr42mAi5Rfz7yh3Y4eD7q5AJdzk7XzvYPNC3FW0QDsH6NhNKwlhxTcj4AIassBQ==" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a> +<encrypted hint="Don't read it." hash="4d35086eef63234bf06581d1a11d4e6258ada0bda4e7fca62e6450251f74a650" encont="8BZ58RiHYpZTtmvp0BHcSWfXHYuMEs0r1jF7uHqWd0/DUylP7PSzljO4YzaWrMuP7cc/YsMxHAzJKM1Sn0qXQQPyHLXvfiULvjbpQYC5JTUwFmbxdxYEl5sVFPViFmC2kjiSeFkTZxAC2ZZtIcD4APzt9/LW1F5E6bQZphDX9JaL6/v8YpeVQWCTG3cKVIeCHFCytIw700UC6C4kZK7U4hc8y2uU+qPF8q700NvSMwuWmbVQTXQQwQ==" enid="1">This section is encrypted. Click <a href="javascript:void(0)" onclick="decryptui(1)">here</a> to decrypt. <noscript>Note that you need have JavaScript enabled for decryption.</noscript></encrypted> <p> Did you regret reading it? diff --git a/blog/post/2017-11-25.html b/blog/post/2017-11-25.html index a3e1a14..55441b4 100644 --- a/blog/post/2017-11-25.html +++ b/blog/post/2017-11-25.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2017-12-21.html b/blog/post/2017-12-21.html index 51268fe..50d948e 100644 --- a/blog/post/2017-12-21.html +++ b/blog/post/2017-12-21.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,44 +31,15 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> -</head> +<style> +table,td,th{border:1px solid grey;} +table{border-collapse:collapse;width:98%;} +td{padding:1em;} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -106,11 +78,7 @@ loadTheme(); <p> <a href="https://www.tail0r.com/why-choose-mac/">原文链接</a> </p> -<style> -table,td,th{border:1px solid grey;} -table{border-collapse:collapse;width:98%;} -td{padding:1em;} -</style> + <table> <tbody><tr> <td width="56%"><p> diff --git a/blog/post/2018-01-05.html b/blog/post/2018-01-05.html index b5731e2..d300102 100644 --- a/blog/post/2018-01-05.html +++ b/blog/post/2018-01-05.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2018-01-07.html b/blog/post/2018-01-07.html index 07f4e8b..abd2da9 100644 --- a/blog/post/2018-01-07.html +++ b/blog/post/2018-01-07.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,44 +31,13 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> -</head> +<style> +article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -92,9 +62,7 @@ loadTheme(); <div id="datetags" class="TText" style="margin-bottom:1em;">2018-01-07<br>#garbage #daily-life</div> <hr><div id="article" class="TText"> <article> -<style> -article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} -</style> + <p> 这个系列的文章自开始写作以来,似乎都没有按照一开始预想的「这学期发生了什么」 这样的思路来写。而是变成了「这学期发生了什么+这学期的各种胡言乱语的聚集地」…… diff --git a/blog/post/2018-02-05.html b/blog/post/2018-02-05.html index 1476c38..c356646 100644 --- a/blog/post/2018-02-05.html +++ b/blog/post/2018-02-05.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2018-03-17.html b/blog/post/2018-03-17.html index aa9734f..b96b0b8 100644 --- a/blog/post/2018-03-17.html +++ b/blog/post/2018-03-17.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2018-04-17.html b/blog/post/2018-04-17.html index 59b99f0..1d62378 100644 --- a/blog/post/2018-04-17.html +++ b/blog/post/2018-04-17.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2018-04-22.html b/blog/post/2018-04-22.html index 7311f13..c55c426 100644 --- a/blog/post/2018-04-22.html +++ b/blog/post/2018-04-22.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,44 +31,29 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> -</head> +<style> +frac{ + text-indent:0; + display:inline-block; + font-size:50%; + text-align:center; + position:relative; + top:4px; +} +frac>sup{ + display:block; + border-bottom:1px solid; + font:inherit; +} +frac>sub{ + display:block; + font:inherit; +} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -91,25 +77,7 @@ loadTheme(); <h2 id="titleh" class="TText" style="font-wight:normal;">ICPC类比赛中计算几何问题之「乱象」</h2> <div id="datetags" class="TText" style="margin-bottom:1em;">2018-04-22<br>#garbage #acmicpc</div> <hr><div id="article" class="TText"> -<style> -frac{ - text-indent:0; - display:inline-block; - font-size:50%; - text-align:center; - position:relative; - top:4px; -} -frac>sup{ - display:block; - border-bottom:1px solid; - font:inherit; -} -frac>sub{ - display:block; - font:inherit; -} -</style> + <article> <p> 虽然我还从未在博客里面写过一篇仅与ACM/ICPC相关的文章,但是今天情况发生了改变…… diff --git a/blog/post/2018-05-03.html b/blog/post/2018-05-03.html index 1cc52bd..76f3d71 100644 --- a/blog/post/2018-05-03.html +++ b/blog/post/2018-05-03.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,67 +31,10 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> -</head> -<body onload="ol()" style="overflow-x:hidden;"> - <div id="panel" class="TText"> - <ul id="panellist"> - <li><a href="/"><h1>Chrisoft</h1></a></li> - <li><a href="/blog"><h2>Blog</h2></a></li> - <li><a href="#"><h3 id="title">Are you an Apple fanboy/fangirl?</h3></a></li> - <li><span>Tags</span> - <ul id="tagslist"> - <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/interactive/">interactive</a></li></ul> - </li> - <li id="tocouter" style="display: none;"> - <span>Table of Contents</span> - <ul id="tocroot"> - </ul> - </li> - <li style="margin-left:-0.5em"><a id="prevp" href="2018-04-22.html">Prev post</a></li> - <li style="margin-left:-0.5em"><a id="nextp" href="2018-05-08.html">Next post</a></li> - </ul> - </div> - <div id="content"> - <h2 id="titleh" class="TText" style="font-wight:normal;">Are you an Apple fanboy/fangirl?</h2> - <div id="datetags" class="TText" style="margin-bottom:1em;">2018-05-03<br>#garbage #interactive</div> - <hr><div id="article" class="TText"> <style> input[type=radio],input[type=checkbox]{ -webkit-appearance:none; @@ -124,7 +68,31 @@ input[type=radio]:checked{ input[type=checkbox]:checked.check:after{ display:block; } -</style> +</style></head> +<body onload="ol()" style="overflow-x:hidden;"> + <div id="panel" class="TText"> + <ul id="panellist"> + <li><a href="/"><h1>Chrisoft</h1></a></li> + <li><a href="/blog"><h2>Blog</h2></a></li> + <li><a href="#"><h3 id="title">Are you an Apple fanboy/fangirl?</h3></a></li> + <li><span>Tags</span> + <ul id="tagslist"> + <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/interactive/">interactive</a></li></ul> + </li> + <li id="tocouter" style="display: none;"> + <span>Table of Contents</span> + <ul id="tocroot"> + </ul> + </li> + <li style="margin-left:-0.5em"><a id="prevp" href="2018-04-22.html">Prev post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="2018-05-08.html">Next post</a></li> + </ul> + </div> + <div id="content"> + <h2 id="titleh" class="TText" style="font-wight:normal;">Are you an Apple fanboy/fangirl?</h2> + <div id="datetags" class="TText" style="margin-bottom:1em;">2018-05-03<br>#garbage #interactive</div> + <hr><div id="article" class="TText"> + <article> <p> <b>DISCLAIMER:</b> This poll does not send any of your response to the server. diff --git a/blog/post/2018-05-08.html b/blog/post/2018-05-08.html index b716be6..9db1504 100644 --- a/blog/post/2018-05-08.html +++ b/blog/post/2018-05-08.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2018-05-18.html b/blog/post/2018-05-18.html index 191626f..d45ddb4 100644 --- a/blog/post/2018-05-18.html +++ b/blog/post/2018-05-18.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2018-06-05.html b/blog/post/2018-06-05.html index a68f33e..afd7fb1 100644 --- a/blog/post/2018-06-05.html +++ b/blog/post/2018-06-05.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2018-06-07.html b/blog/post/2018-06-07.html index fc6e175..ff7cca1 100644 --- a/blog/post/2018-06-07.html +++ b/blog/post/2018-06-07.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> diff --git a/blog/post/2018-10-11.html b/blog/post/2018-10-11.html index 25c4f8b..19c0055 100644 --- a/blog/post/2018-10-11.html +++ b/blog/post/2018-10-11.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -91,18 +59,33 @@ loadTheme(); <h2 id="titleh" class="TText" style="font-wight:normal;">The stupid blogging system evolved!</h2> <div id="datetags" class="TText" style="margin-bottom:1em;">2018-10-11<br>#web #devel #js</div> <hr><div id="article" class="TText"><article> -<p>As you may not have noticed this time, the blogging system I am currently on received yet another major revamp: unlike the previous SBS, which will not work at all if you have JavaScript disabled or trying to browse with lynx/links/w3m, the new SSBS is almost fully static: no JavaScript involved on the client side if you decide not to read my encrypted crap!</p> -<p>This is a rather small update on the visual side: it shouldn't have a huge impact on the reading experience by only stripping away some animations. More changes are actually under the hood.</p> -<p>SBS 2.0 is archived and retired immediately. Old URLs will not be redirected. Substantial changes may still come up to the current version and may break unless a complete reload is performed.</p> +<p>As you may not have noticed this time, the blogging system I am +currently on received yet another major revamp: unlike the previous SBS, +which will not work at all if you have JavaScript disabled or trying to +browse with lynx/links/w3m, the new SSBS is almost fully static: no +JavaScript involved on the client side if you decide not to read my +encrypted crap!</p> +<p>This is a rather small update on the visual side: it shouldn’t have a +huge impact on the reading experience by only stripping away some +animations. More changes are actually under the hood.</p> +<p>SBS 2.0 is archived and retired immediately. Old URLs will not be +redirected. Substantial changes may still come up to the current version +and may break unless a complete reload is performed.</p> <p>Full changelog below:</p> <ul> <li>+ Static page generator using node.js.</li> <li>+ Content encryption with AES instead of simple XOR.</li> -<li>+ Decryptor now remembers every correct passphrases in local storage and try to decrypt once the page has been loaded.</li> -<li>+ Optional custom preprocessor pass for markdown/reStructuredText support.</li> -<li>- Vim-like command buffer, animations and key bindings removed on the posts listing page.</li> +<li>+ Decryptor now remembers every correct passphrases in local storage +and try to decrypt once the page has been loaded.</li> +<li>+ Optional custom preprocessor pass for markdown/reStructuredText +support.</li> +<li>- Vim-like command buffer, animations and key bindings removed on +the posts listing page.</li> </ul> -<p>The decryptor requires a ES7-enabled browser to work. All testing was done in Chromium 71 and Firefox 62. I don't use 'JavaScript best practices' or 'industrial standard testing processes'. It <em>just</em> works.</p> +<p>The decryptor requires a ES7-enabled browser to work. All testing was +done in Chromium 71 and Firefox 62. I don’t use ‘JavaScript best +practices’ or ‘industrial standard testing processes’. It <em>just</em> +works.</p> Find out more <a href="https://cgit.chrisoft.org/sbs.git/about/">here</a>. </article> </div><br><hr> diff --git a/blog/post/2018-12-06.html b/blog/post/2018-12-06.html index 21faccb..3517fcf 100644 --- a/blog/post/2018-12-06.html +++ b/blog/post/2018-12-06.html @@ -1,4 +1,4 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> @@ -60,9 +60,14 @@ function ol() <div id="datetags" class="TText" style="margin-bottom:1em;">2018-12-06<br>#device-review #hands-on</div> <hr><div id="article" class="TText"><article> <h2 id="tocanch0" class="tvis">前言</h2> -<p>第三次买小米的东西,同时也是第二次买小米的手机。跟很多「米粉」相比, 这个数量应该还不到他们的零头。</p> -<p>前两次使用小米的产品,印象都不能算好。<a href="https://chrisoft.org/blog/post/2017-02-13.html#tocanch5">小米 MAX</a> 不到一年开始自动重启, 至于小米<del>铁圈</del>圈铁 Pro <a id="n1" href="#note1" class="note">[1]</a>, 说好的大概都是骨灰级米粉。</p> -<p>怎奈 Galaxy Note 4 里与奔腾 4 一样辣鸡的骁龙 805 实在不争气,不光能让塑料壳手机当暖手宝用,续航更是尿崩。 于是就又有了败家的想法。</p> +<p>第三次买小米的东西,同时也是第二次买小米的手机。跟很多「米粉」相比, +这个数量应该还不到他们的零头。</p> +<p>前两次使用小米的产品,印象都不能算好。<a href="https://chrisoft.org/blog/post/2017-02-13.html#tocanch5">小米 +MAX</a> 不到一年开始自动重启, 至于小米<del>铁圈</del>圈铁 Pro +<a id="n1" href="#note1" class="note">[1]</a>, 说好的大概都是骨灰级米粉。</p> +<p>怎奈 Galaxy Note 4 里与奔腾 4 一样辣鸡的骁龙 805 +实在不争气,不光能让塑料壳手机当暖手宝用,续航更是尿崩。 +于是就又有了败家的想法。</p> <h2 id="tocanch1" class="tvis">购买前</h2> <p>早在去年,我就给自己以后的手机选择立下了三条规矩:</p> <ul> @@ -71,59 +76,157 @@ function ol() <li>拒绝将两个摄像头纵向排列在背面角落的机型</li> </ul> <p><a id="n3" href="#note3" class="note">[3]</a></p> -<p>除此之外还有额外的几条加分项: - 可以有办法获得接近 AOSP 的体验,官方提供则更好。 - OLED 2k 屏 <a id="n4" href="#note4" class="note">[4]</a></p> -<p>上面的三条规矩的重要程度基本上是递减的:我不能忍受任何屏幕被啃掉一块的机型, 然而耳机插孔和摄像头排列相对就没有那么重要了。尤其是在给 Galaxy Note 4 配上无线充电后,发现 Micro-USB 的使用频率已经非常低了。这么一来后面两个规矩就几乎形同虚设了。</p> -<p>至于加分项,得益于 Project Treble ,现在的大多数 Android 手机大概都能满足第一项。 第二条则相对比较难以满足了,于是后来它就被拆分成了两个单独的条目。</p> -<p>机型选择上,首先看上的还是「老朋友」 Nokia 的 Nokia 8,然而该机型在中国实在难以购得。 于是又盯上了它的后续版本 Nokia 8 Sirocco。然而它的价格对于一款采用过时平台的手机来说有点高了。 后来又想到了用了6年多的三星,可惜三星现在的高端机型也是完全买不起的。于是我打算11月中旬去香港的时候顺便看一圈再决定了。 <a id="n5" href="#note5" class="note">[5]</a></p> -<p>就在这个时候,小米发布了 MIX 3。我向来不是非常关注小米的产品。发布会看了5秒就关掉了, 只看到一个雷军在故宫的什么建筑物前面「做现场的表演」。过了几天看了一眼相关信息,觉得好像还可以(除了犯了规矩的后两条, 以及小米万年的 1080p 屏幕)。于是就计划再给小米一次改变我对它的看法的机会,做了「先买再说,不行7天退货」的打算。</p> -<p>当然在购买前我已经做好了一部分钱会打水漂的心理准备:因为从来不用前置摄像头, 所以花在这些东西连同被吹得特别厉害的滑盖<a id="n6" href="#note6" class="note">[6]</a> 上的钱就相当于浪费掉了;还有永远不会用到的 16GB 之后的存储空间。<del>这些钱是永远也会不来了。</del></p> +<p>除此之外还有额外的几条加分项: - 可以有办法获得接近 AOSP +的体验,官方提供则更好。 - OLED 2k 屏 +<a id="n4" href="#note4" class="note">[4]</a></p> +<p>上面的三条规矩的重要程度基本上是递减的:我不能忍受任何屏幕被啃掉一块的机型, +然而耳机插孔和摄像头排列相对就没有那么重要了。尤其是在给 Galaxy Note 4 +配上无线充电后,发现 Micro-USB +的使用频率已经非常低了。这么一来后面两个规矩就几乎形同虚设了。</p> +<p>至于加分项,得益于 Project Treble ,现在的大多数 Android +手机大概都能满足第一项。 +第二条则相对比较难以满足了,于是后来它就被拆分成了两个单独的条目。</p> +<p>机型选择上,首先看上的还是「老朋友」 Nokia 的 Nokia +8,然而该机型在中国实在难以购得。 于是又盯上了它的后续版本 Nokia 8 +Sirocco。然而它的价格对于一款采用过时平台的手机来说有点高了。 +后来又想到了用了6年多的三星,可惜三星现在的高端机型也是完全买不起的。于是我打算11月中旬去香港的时候顺便看一圈再决定了。 +<a id="n5" href="#note5" class="note">[5]</a></p> +<p>就在这个时候,小米发布了 MIX +3。我向来不是非常关注小米的产品。发布会看了5秒就关掉了, +只看到一个雷军在故宫的什么建筑物前面「做现场的表演」。过了几天看了一眼相关信息,觉得好像还可以(除了犯了规矩的后两条, +以及小米万年的 1080p +屏幕)。于是就计划再给小米一次改变我对它的看法的机会,做了「先买再说,不行7天退货」的打算。</p> +<p>当然在购买前我已经做好了一部分钱会打水漂的心理准备:因为从来不用前置摄像头, +所以花在这些东西连同被吹得特别厉害的滑盖<a id="n6" href="#note6" class="note">[6]</a> +上的钱就相当于浪费掉了;还有永远不会用到的 16GB +之后的存储空间。<del>这些钱是永远也会不来了。</del></p> <h2 id="tocanch2" class="tvis">剁手</h2> -<p>有着「猴王」美称的雷军怎么可能让我这只不谙世道的小猴子顺利购买他们的最新机型呢。11月1号第一批在最多20秒之后就……没有了。 于是只好等11月11号。</p> -<p>11月11号的开卖时间是凌晨0点。这对在23:00以后只能在宿舍玩手机的我是极大的一个不利。0点过去了, 小米官网的购买通道果然进入了预期中的无限排队模式。无奈只好试一下小米的×猫官方旗舰店,发现还有货, 不过只剩下了 6/128 和 8/256 的型号。这就让本来计划购买 8/128 版本的我十分为难了。后来在 「既然已经被小米坑了3000多元了,再多被坑400元也不是什么大问题」的思想的唆使下,剁了 8/256 的型号。 (于是永远被浪费掉得存储空间变得更多了)</p> +<p>有着「猴王」美称的雷军怎么可能让我这只不谙世道的小猴子顺利购买他们的最新机型呢。11月1号第一批在最多20秒之后就……没有了。 +于是只好等11月11号。</p> +<p>11月11号的开卖时间是凌晨0点。这对在23:00以后只能在宿舍玩手机的我是极大的一个不利。0点过去了, +小米官网的购买通道果然进入了预期中的无限排队模式。无奈只好试一下小米的×猫官方旗舰店,发现还有货, +不过只剩下了 6/128 和 8/256 的型号。这就让本来计划购买 8/128 +版本的我十分为难了。后来在 +「既然已经被小米坑了3000多元了,再多被坑400元也不是什么大问题」的思想的唆使下,剁了 +8/256 的型号。 (于是永远被浪费掉得存储空间变得更多了)</p> <h2 id="tocanch3" class="tvis">到货</h2> -<p>付款之后,小米迟迟没有发货的迹象。直到15号我的飞机已经在香港落地之后货才发出。当然顺丰依然是跟往常一样快, 似乎根本没有受到「双十一」<a id="n7" href="#note7" class="note">[7]</a>的影响, 第二天就到货了。托了一个同学帮忙去取。他在拿到快递之后的第一句话是「包装好简陋啊」。嗯……不祥的预感。</p> -<p>从香港回来之后看到了静静躺在我的桌子上的 MIX 3 包装盒,还有一张「价值300元」 <a id="n8" href="#note8" class="note">[8]</a>的小米移动电话卡。开箱做了各种检查之后,发现不幸并没有降临在我的头上。 真是万幸(</p> +<p>付款之后,小米迟迟没有发货的迹象。直到15号我的飞机已经在香港落地之后货才发出。当然顺丰依然是跟往常一样快, +似乎根本没有受到「双十一」<a id="n7" href="#note7" class="note">[7]</a>的影响, +第二天就到货了。托了一个同学帮忙去取。他在拿到快递之后的第一句话是「包装好简陋啊」。嗯……不祥的预感。</p> +<p>从香港回来之后看到了静静躺在我的桌子上的 MIX 3 +包装盒,还有一张「价值300元」 +<a id="n8" href="#note8" class="note">[8]</a>的小米移动电话卡。开箱做了各种检查之后,发现不幸并没有降临在我的头上。 +真是万幸(</p> <h2 id="tocanch4" class="tvis">第一印象</h2> <ul> -<li>重。MIX 3 用了一段时间再次拿起 Galaxy Note 4 的时候,会觉得塑料壳手机好轻(</li> -<li>滑。后盖简直可以当镜子用。比塑料壳手机看起来不知道要高到那里去了。<del>然而滑到不加壳根本不敢用,所以最后还是塑料壳手机。</del> 同时后壳还是指纹收集器。</li> +<li>重。MIX 3 用了一段时间再次拿起 Galaxy Note 4 +的时候,会觉得塑料壳手机好轻(</li> +<li>滑。后盖简直可以当镜子用。比塑料壳手机看起来不知道要高到那里去了。<del>然而滑到不加壳根本不敢用,所以最后还是塑料壳手机。</del> +同时后壳还是指纹收集器。</li> </ul> -<p>整部手机的外形尺寸与 Galaxy Note 4 几乎一致(宽度稍窄,长度略长),却比 Galaxy Note 4 重了 25%。 「半斤米」真是名不虚传。</p> -<p>没有遇到网传的屏幕左右晃动问题。我手里这台的屏幕晃动幅度不比任何一台曾经用过的滑盖手机大。 1080p 的屏幕当然没有 1440p 的细腻,但是「又不是不能用」(</p> -<p>至于被小米吹爆的拍照,感觉实际表现一般般。下面这张是从辣鸡专科学校宿舍里拍的 (point-and-shoot,全为自动设定)。 作为对比,右边一张是 Galaxy Note 4 <a id="n9" href="#note9" class="note">[9]</a> 拍的。 (其实我关掉过拍照水印。但是为了拍这张照片专门恢复了全部初始设定。另外我认为拍照上打水印属于作弊行为 —— 与考试在试卷上做答题以外的记号毫无区别。)</p> +<p>整部手机的外形尺寸与 Galaxy Note 4 +几乎一致(宽度稍窄,长度略长),却比 Galaxy Note 4 重了 25%。 +「半斤米」真是名不虚传。</p> +<p>没有遇到网传的屏幕左右晃动问题。我手里这台的屏幕晃动幅度不比任何一台曾经用过的滑盖手机大。 +1080p 的屏幕当然没有 1440p 的细腻,但是「又不是不能用」(</p> +<p>至于被小米吹爆的拍照,感觉实际表现一般般。下面这张是从辣鸡专科学校宿舍里拍的 +(point-and-shoot,全为自动设定)。 作为对比,右边一张是 Galaxy Note 4 +<a id="n9" href="#note9" class="note">[9]</a> 拍的。 +(其实我关掉过拍照水印。但是为了拍这张照片专门恢复了全部初始设定。另外我认为拍照上打水印属于作弊行为 +—— 与考试在试卷上做答题以外的记号毫无区别。)</p> <p>(图丢了,请自行想象两个不同时期的菜鸡互啄的场景(不是))</p> -<p>与人眼的感受相比,MIX 3 的图像明显过亮。相比之下 Galaxy Note 4 的结果更接近实际感受(噪点数量不接近)。 <del>至于什么 DxOMark,都是钱买来的,当笑话看就好。</del> <a id="n10" href="#note10" class="note">[10]</a></p> +<p>与人眼的感受相比,MIX 3 的图像明显过亮。相比之下 Galaxy Note 4 +的结果更接近实际感受(噪点数量不接近)。 <del>至于什么 +DxOMark,都是钱买来的,当笑话看就好。</del> <a id="n10" href="#note10" class="note">[10]</a></p> <h2 id="tocanch5" class="tvis">「偷工减料」和「虚假宣传」</h2> <p>首先放一张扫图跟官方渲染图的叠加照片</p> <div style="position:relative;top:0;left:0;"> -<p><img style="position:relative;top:0;left:0;opacity:0.5;z-index:0;" id="s" width="400" src="//filestorage.chrisoft.org/blog/img/mix3_woprotectcover.png" decoding="async"> <img style="position:absolute;top:0;left:2px;opacity:0.5;z-index:1;" id="r" width="396" src="//filestorage.chrisoft.org/blog/img/mix3_render.png" decoding="async"></p> +<p><img style="position:relative;top:0;left:0;opacity:0.5;z-index:0;" id="s" width="400" src="//filestorage.chrisoft.org/blog/img/mix3_woprotectcover.png" decoding="async"> +<img style="position:absolute;top:0;left:2px;opacity:0.5;z-index:1;" id="r" width="396" src="//filestorage.chrisoft.org/blog/img/mix3_render.png" decoding="async"></p> </div> <p><input style="width:100%" type="range" min="0" max="100" value="50" oninput="document.getElementById('r').style.opacity=this.value/100;document.getElementById('s').style.opacity=1-this.value/100;"></p> -<p>可以看到,四侧边框均有所膨胀(由于对齐问题,左侧的边框看起来似乎比右侧膨胀得多些)。 作为一个3元的方便面包装上能画出牛肉的国家的公民,对这样的「虚假宣传」当然是司空见惯。 但是毕竟苹果都不会拿渲染图来糊弄人,小米这种「果粉」企业,就不能从苹果身上学点好东西吗(</p> -<p>另外在官网参数的传感器一栏,MIX 3 似乎缺少了气压计和霍尔传感器。当时我在付款后才发现这点。 于是对阉割旗舰机传感器的小米感到失望。然而机器到手之后,发现实际上是有这两个传感器的。 <del>这应该也算虚假宣传吧?</del></p> -<p>最后,看到 gsmarena 上写的屏幕玻璃是 Corning Gorilla Glass (unspecified version) 就感到了一丝不安。 没过多久我刚离开桌子几步手机就(由于未知的原因)从桌子上掉了下去。背面着地,捡起来一看好像没事。(还好已经套了壳,不然……) 过了几天仔细观察才发现屏幕上已经有了划痕(一处相对不明显的面积约中号记号笔点一个点那么大,另一处是一个凹坑)。 已知是 Corning Gorilla Glass 4 的 Galaxy Note 4 用了一年半还没有什么肉眼可见的划痕。嗯……可以确定 MIX 3 的屏幕玻璃肯定不是 Corning Gorilla Glass 4 了。 <a id="n11" href="#note11" class="note">[11]</a></p> -<p>19年2月14日更新: gsmarena 上更新了信息,发现确实不是 Corning Gorilla Glass 4,而是 Corning Gorilla Glass 5 。 看来还是怪我我艹机太狠了(<a id="n12" href="#note12" class="note">[12]</a></p> +<p>可以看到,四侧边框均有所膨胀(由于对齐问题,左侧的边框看起来似乎比右侧膨胀得多些)。 +作为一个3元的方便面包装上能画出牛肉的国家的公民,对这样的「虚假宣传」当然是司空见惯。 +但是毕竟苹果都不会拿渲染图来糊弄人,小米这种「果粉」企业,就不能从苹果身上学点好东西吗(</p> +<p>另外在官网参数的传感器一栏,MIX 3 +似乎缺少了气压计和霍尔传感器。当时我在付款后才发现这点。 +于是对阉割旗舰机传感器的小米感到失望。然而机器到手之后,发现实际上是有这两个传感器的。 +<del>这应该也算虚假宣传吧?</del></p> +<p>最后,看到 gsmarena 上写的屏幕玻璃是 Corning Gorilla Glass +(unspecified version) 就感到了一丝不安。 +没过多久我刚离开桌子几步手机就(由于未知的原因)从桌子上掉了下去。背面着地,捡起来一看好像没事。(还好已经套了壳,不然……) +过了几天仔细观察才发现屏幕上已经有了划痕(一处相对不明显的面积约中号记号笔点一个点那么大,另一处是一个凹坑)。 +已知是 Corning Gorilla Glass 4 的 Galaxy Note 4 +用了一年半还没有什么肉眼可见的划痕。嗯……可以确定 MIX 3 +的屏幕玻璃肯定不是 Corning Gorilla Glass 4 了。 +<a id="n11" href="#note11" class="note">[11]</a></p> +<p>19年2月14日更新: gsmarena 上更新了信息,发现确实不是 Corning Gorilla +Glass 4,而是 Corning Gorilla Glass 5 。 +看来还是怪我我艹机太狠了(<a id="n12" href="#note12" class="note">[12]</a></p> <h2 id="tocanch6" class="tvis">换掉令人<sup>我</sup>痛苦的 MIUI</h2> <p>可以说 MIUI 是我关于这台手机最担心的特性了。</p> -<p>说实话只要不是北朝鲜那种不准安装任何第三方应用的安卓机,好像都可以凑合用一下。 但是花那么多钱买来的手机肯定还是要自己怎么舒服怎么用的(</p> -<p>因为我个人的手机使用习惯与 >90% 的国人都不同,所以 MIUI 的许多优势特性我都体会不到。 而且小米手机的硬件本身又不像 Galaxy Note 一样提供与可以将它和其他手机一下子区分开的功能 <a id="n13" href="#note13" class="note">[13]</a>, 所以直接解锁手机换掉系统并不会让我对 MIUI 有任何留恋。</p> -<p>于是就开始换系统吧。首先就是要解锁 bootloader。我对手机厂商锁住 bootloader 的做法是完全不在意的 – 在不影响我换系统的前提下<a id="n14" href="#note14" class="note">[14]</a>。 由于以前使用小米 MAX 的时候解锁过手机,所以不需要重新申请解锁资格。打开当时的解锁工具, 连接上处于 fastboot 模式的手机,点一下解锁……本来以为就这么简单的,结果要我换最新的解锁工具。 「还能不让我解锁不成」,我想道。然后就照做了,紧接着就撞上了小米最新的防……我也不知道他们在防什么用的技巧:</p> +<p>说实话只要不是北朝鲜那种不准安装任何第三方应用的安卓机,好像都可以凑合用一下。 +但是花那么多钱买来的手机肯定还是要自己怎么舒服怎么用的(</p> +<p>因为我个人的手机使用习惯与 >90% 的国人都不同,所以 MIUI +的许多优势特性我都体会不到。 而且小米手机的硬件本身又不像 Galaxy Note +一样提供与可以将它和其他手机一下子区分开的功能 +<a id="n13" href="#note13" class="note">[13]</a>, +所以直接解锁手机换掉系统并不会让我对 MIUI 有任何留恋。</p> +<p>于是就开始换系统吧。首先就是要解锁 bootloader。我对手机厂商锁住 +bootloader 的做法是完全不在意的 – +在不影响我换系统的前提下<a id="n14" href="#note14" class="note">[14]</a>。 +由于以前使用小米 MAX +的时候解锁过手机,所以不需要重新申请解锁资格。打开当时的解锁工具, +连接上处于 fastboot +模式的手机,点一下解锁……本来以为就这么简单的,结果要我换最新的解锁工具。 +「还能不让我解锁不成」,我想道。然后就照做了,紧接着就撞上了小米最新的防……我也不知道他们在防什么用的技巧:</p> <p><a href="//filestorage.chrisoft.org/blog/img/lajixiaomi.png"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_lajixiaomi.png"></a></p> -<p>还好我只需要等三天。论坛里看到有些要等十五天甚至三十天的就比较惨了 <a id="n15" href="#note15" class="note">[15]</a>。</p> +<p>还好我只需要等三天。论坛里看到有些要等十五天甚至三十天的就比较惨了 +<a id="n15" href="#note15" class="note">[15]</a>。</p> <p>我的不自愿三天 MIUI 体验就这么开始了。</p> -<p>虽然以前用过小米的手机,但是因为对充满 iOS 味的 MIUI 的抵制,所以实际交互时间可能不到 12 个小时。 这次发现好像除了整个系统弥漫着果味和几个小 bug 之外,好像明确可以指出的缺点也没那么多 —— 至少在登录 Google 账号,换掉没有 App drawer 的 MIUI 默认 launcher 之后还是可以凑合用的。</p> -<p>至于前面提到的小 bug,大概都是些许多人都碰不到的毛病。因为用手机习惯把控件大小调小些用, 所以拿到之后第一步就是去设置里找显示大小的选项。然而在当时版本的系统里并没有发现这个选项 <a id="n16" href="#note16" class="note">[16]</a>。于是我就只好去开发者选项里调最小宽度了。 调完之后就出现了各种奇怪的状况……</p> -<p>各种界面元素错位还有莫名其妙被砍了一刀的图标什么的。顺便右边的图里还有我这三天中看到的唯一一条 M(A)I(D)UI 广告,看到之后内置浏览器就被我设法禁用了。当然,这些问题远未达到影响正常使用的程度,只是看起来不爽罢了。</p> -<p>MIUI 体验日的最后一天,收到一个 OTA。装上之后发现图标里出白框的毛病没有了,但是界面元素错位的问题还在。 此时我早已不在乎这些小毛病 —— 因为马上就可以刷机了。</p> -<p>托 Project Treble 的福,这台刚出的设备也有很大概率能找到适合日常使用的第三方系统。 行动的时间到了,解锁,刷 vbmeta ,刷 A/B device 用的 system<a id="n17" href="#note17" class="note">[17]</a></p> +<p>虽然以前用过小米的手机,但是因为对充满 iOS 味的 MIUI +的抵制,所以实际交互时间可能不到 12 个小时。 +这次发现好像除了整个系统弥漫着果味和几个小 bug +之外,好像明确可以指出的缺点也没那么多 —— 至少在登录 Google +账号,换掉没有 App drawer 的 MIUI 默认 launcher +之后还是可以凑合用的。</p> +<p>至于前面提到的小 +bug,大概都是些许多人都碰不到的毛病。因为用手机习惯把控件大小调小些用, +所以拿到之后第一步就是去设置里找显示大小的选项。然而在当时版本的系统里并没有发现这个选项 +<a id="n16" href="#note16" class="note">[16]</a>。于是我就只好去开发者选项里调最小宽度了。 +调完之后就出现了各种奇怪的状况……</p> +<p>各种界面元素错位还有莫名其妙被砍了一刀的图标什么的。顺便右边的图里还有我这三天中看到的唯一一条 +M(A)I(D)UI +广告,看到之后内置浏览器就被我设法禁用了。当然,这些问题远未达到影响正常使用的程度,只是看起来不爽罢了。</p> +<p>MIUI 体验日的最后一天,收到一个 +OTA。装上之后发现图标里出白框的毛病没有了,但是界面元素错位的问题还在。 +此时我早已不在乎这些小毛病 —— 因为马上就可以刷机了。</p> +<p>托 Project Treble +的福,这台刚出的设备也有很大概率能找到适合日常使用的第三方系统。 +行动的时间到了,解锁,刷 vbmeta ,刷 A/B device 用的 +system<a id="n17" href="#note17" class="note">[17]</a></p> <h2 id="tocanch7" class="tvis">终于,小米脱掉了……</h2> <p>我给它戴上的「二流品牌」的帽子?</p> <p>也许还没有。至少没有完全脱掉。</p> <hr> -<p>2021-01-30: 因为个人无限的拖延,这篇文章可能永远也无法完成了……因为现在再写的话就不叫上手体验了。</p> -<p>那么说下这两年来的使用感受吧。实际上纯粹使用MIX 3的时间可能也就一年半多一点,因为大部分时间是同时带着 Galaxy Note 4和MIX 3的(当然Galaxy Note 4的角色基本沦为了刷机刷砖或者送修时的备用机)。 中间用过数种不同的系统:Pixel Experience, Resurrection Remix, (自己编译的和别人编译的)Lineage OS, Arrow OS,甚至 Google 的 AOSP GIS,当然少不了 xiaomi.eu 和国行的MIUI。</p> +<p>2021-01-30: +因为个人无限的拖延,这篇文章可能永远也无法完成了……因为现在再写的话就不叫上手体验了。</p> +<p>那么说下这两年来的使用感受吧。实际上纯粹使用MIX +3的时间可能也就一年半多一点,因为大部分时间是同时带着 Galaxy Note 4和MIX +3的(当然Galaxy Note 4的角色基本沦为了刷机刷砖或者送修时的备用机)。 +中间用过数种不同的系统:Pixel Experience, Resurrection Remix, +(自己编译的和别人编译的)Lineage OS, Arrow OS,甚至 Google 的 AOSP +GIS,当然少不了 xiaomi.eu 和国行的MIUI。</p> <p>在武汉的时候用国行MIUI里的小米钱包刷过几次地铁,是有点厉害。不过后来还是滚回了老套的支付方式。</p> -<p>用得最久的当然还是Lineage OS。主要原因还是他们的基础设施和编译指南文档都不错,想自己做点小定制也容易。 事实上如今的Lineage OS,在CM挂掉经历了数次功能上的阉割后,已经与AOSP相差无几了。当然对我这种 <code>~/bin</code> 里好几十个自制脚本,<code>.zshrc</code> 里也有好多自制函数的用户来说,问题并不大。再加上平时用的国产流氓应用极少 (TIM和微信)以及我有独特的制伏国产流氓应用的技巧,就这么一直用下来了。至于别人说的bug多, 也许是因为我的手机基本只有打电话看网页刷reddit的功能,并没有遇到过因为系统bug导致掉链子的事情。 (我坚信微信的任何问题都必然是疼讯的问题(</p> +<p>用得最久的当然还是Lineage +OS。主要原因还是他们的基础设施和编译指南文档都不错,想自己做点小定制也容易。 +事实上如今的Lineage +OS,在CM挂掉经历了数次功能上的阉割后,已经与AOSP相差无几了。当然对我这种 +<code>~/bin</code> 里好几十个自制脚本,<code>.zshrc</code> +里也有好多自制函数的用户来说,问题并不大。再加上平时用的国产流氓应用极少 +(TIM和微信)以及我有独特的制伏国产流氓应用的技巧,就这么一直用下来了。至于别人说的bug多, +也许是因为我的手机基本只有打电话看网页刷reddit的功能,并没有遇到过因为系统bug导致掉链子的事情。 +(我坚信微信的任何问题都必然是疼讯的问题(</p> <p>接下来说说售后和手机本身的质量吧。</p> <ul> <li>滑盖的缝里能插纸,这已经不是什么新鲜事了<a id="n18" href="#note18" class="note">[18]</a></li> @@ -131,25 +234,66 @@ function ol() <li>使用一年多后,有一片“匚”形金属片从滑盖机关中掉落出来,但似乎并未对滑盖功能造成影响。</li> <li>一年半时从约1.2米处摔落,屏幕一角的玻璃破碎。</li> </ul> -<p>虽然都是些边边角角的小问题,对日常使用影响不大(玻璃碎了除外)。看到小米有399换屏幕玻璃的维修项目, 还是选择换了屏幕玻璃。送修之前做了factory reset。从学校寄到天津维修工厂之后被通知玻璃更换需要转寄到深圳工厂, 从寄出到重新拿到手总共花了一周时间。比较令人欣慰的是小米的维修工厂保留了我的第三方系统(尽管我跟客服说了可以刷机)。 然而使用不过一个月之后,屏幕却完全无法显示了(有数条水平亮线)。听说小米有维修后保修一个月的政策, 于是决定尝试再修一次。手机被天津维修工厂收到之后,被通知查不到维修记录,需要寄到上次维修的工厂。如此一来, 这次维修又花了一周。这次维修我的第三方系统仍然得以保留,而且算下来我只用了400元就换掉了整个屏幕总成 (原价850)……</p> +<p>虽然都是些边边角角的小问题,对日常使用影响不大(玻璃碎了除外)。看到小米有399换屏幕玻璃的维修项目, +还是选择换了屏幕玻璃。送修之前做了factory +reset。从学校寄到天津维修工厂之后被通知玻璃更换需要转寄到深圳工厂, +从寄出到重新拿到手总共花了一周时间。比较令人欣慰的是小米的维修工厂保留了我的第三方系统(尽管我跟客服说了可以刷机)。 +然而使用不过一个月之后,屏幕却完全无法显示了(有数条水平亮线)。听说小米有维修后保修一个月的政策, +于是决定尝试再修一次。手机被天津维修工厂收到之后,被通知查不到维修记录,需要寄到上次维修的工厂。如此一来, +这次维修又花了一周。这次维修我的第三方系统仍然得以保留,而且算下来我只用了400元就换掉了整个屏幕总成 +(原价850)……</p> <p>当然小米的售后也不是没有问题的……:</p> <ul> -<li>线下售后对MIX 3这种小众机型几乎相当于毫无作用。他们无法提供任何检查和零件更换服务。</li> +<li>线下售后对MIX +3这种小众机型几乎相当于毫无作用。他们无法提供任何检查和零件更换服务。</li> <li>维修后,屏幕边缘的塑料边框上有几处被刀片划伤的痕迹。</li> <li>第二次返修后,后盖没有完全合上。</li> </ul> -<p>第二次修完后,还有一段小故事:没过两天手机掉进装满水的盆子里了。虽然没过两秒就捞了出来, 不过因为当时还没有发现后盖没有完全合上,所以……</p> -<p>随后很快就发现了后盖没有合上(而且也相当于是因祸得福了)。 于是立刻把手机拆了个稀烂然后和几包干燥剂一起放在密封袋中置于北京滚烫的暖气上。放了大约四个多小时之后, 袋中不再出现水汽。于是重新组装起来,战战兢兢地使用到现在(三个月),暂时还没有爆炸(</p> -<p>再扯点别的东西吧。如今的手机厂商,都一心想着如何出头露面,做出来的设计和功能,十有八九无非只是噱头。 从所谓的全面屏,到五花八门的异形屏,对实际的交互和观感的改进,都基本可以忽略不计 (观感方面,异形屏甚至可以说是相当大的破坏——当然观感是主观感受)。手机背面的摄像头从一个变成两个三个甚至四五个, 手里这台DxOMark曾经第一的手机却还是连个电路板都拍不清楚,也是不知让人从何说起。充电速度也变成了纯粹的数字竞争。 真不知道再换手机的时候这里将是什么样的一派景象。</p> -<p>至于小米,起初作为「搅局者」,起到的作用自然不可小觑。在更加深入地了解手机从硬件到系统开发的流程和成本后, 小米能把手机价格压到这个水平,也是相当令人印象深刻的。当然小米不会就这么容易地放弃利润,这些压下来的价格, 还是要通过各种方式赚回来的。不过对于我这种买手机只是买硬件,对于自带软件,包括系统,则一视同仁地直接抹掉的用户, 小米之流就无法从我这里赚到什么东西了。</p> -<p>当然还有Pinephone, Librem 5这类的「搅局者」。这些设备一旦售出,用户和厂商基本就不会产生金钱上的关系了。 于是回本的重任就全都落到了售价上。这也导致了这些机型(相对它们的配置)高到离谱的售价。即便售价下来以后, 考虑到它们的可用度,现在将这类机型作为日常机型对我个人来说还是为时尚早。</p> +<p>第二次修完后,还有一段小故事:没过两天手机掉进装满水的盆子里了。虽然没过两秒就捞了出来, +不过因为当时还没有发现后盖没有完全合上,所以……</p> +<p>随后很快就发现了后盖没有合上(而且也相当于是因祸得福了)。 +于是立刻把手机拆了个稀烂然后和几包干燥剂一起放在密封袋中置于北京滚烫的暖气上。放了大约四个多小时之后, +袋中不再出现水汽。于是重新组装起来,战战兢兢地使用到现在(三个月),暂时还没有爆炸(</p> +<p>再扯点别的东西吧。如今的手机厂商,都一心想着如何出头露面,做出来的设计和功能,十有八九无非只是噱头。 +从所谓的全面屏,到五花八门的异形屏,对实际的交互和观感的改进,都基本可以忽略不计 +(观感方面,异形屏甚至可以说是相当大的破坏——当然观感是主观感受)。手机背面的摄像头从一个变成两个三个甚至四五个, +手里这台DxOMark曾经第一的手机却还是连个电路板都拍不清楚,也是不知让人从何说起。充电速度也变成了纯粹的数字竞争。 +真不知道再换手机的时候这里将是什么样的一派景象。</p> +<p>至于小米,起初作为「搅局者」,起到的作用自然不可小觑。在更加深入地了解手机从硬件到系统开发的流程和成本后, +小米能把手机价格压到这个水平,也是相当令人印象深刻的。当然小米不会就这么容易地放弃利润,这些压下来的价格, +还是要通过各种方式赚回来的。不过对于我这种买手机只是买硬件,对于自带软件,包括系统,则一视同仁地直接抹掉的用户, +小米之流就无法从我这里赚到什么东西了。</p> +<p>当然还有Pinephone, Librem +5这类的「搅局者」。这些设备一旦售出,用户和厂商基本就不会产生金钱上的关系了。 +于是回本的重任就全都落到了售价上。这也导致了这些机型(相对它们的配置)高到离谱的售价。即便售价下来以后, +考虑到它们的可用度,现在将这类机型作为日常机型对我个人来说还是为时尚早。</p> <p>所以这篇体验文写了两年多最后还是这么烂,以后还是不要写这种东西了。</p> </article> <!-- vim: tw=0 syntax=markdown --> </div><br><hr> - <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <del>听音乐只能听到_Hi_-hat,所以是_Hi_-Res Audio(</del><br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 圆角屏幕并不在此列<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 将符合上面三条的手机筛选出来,你会发现某水果公司生产的奢侈品赫然在列。 当然原因并不全是因为我是 “Apple Hater”,主要还是对其他厂商无故跟风的嫌弃(<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: <s>主要是不想要一台比旧手机屏幕更差的新机(</s><br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: <del>全怪苹果恶意哄抬物价</del> 尽管三星的旧机型价格跳水仍然很厉害,然而这次不太想买过时平台的机型了。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 我曾经宣称到手就会吧屏幕用502粘起来, 但是现在发现玩起来找回了当年玩高中同学的 Nokia X3 的感觉(lbz是不是打喷嚏了),所以就没有粘。<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 有人能告诉我这个东西是怎么被硬生生地从无到有造出来的吗?<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 实际价值<10元<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 非官方系统 (LineageOS 15.1)<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: <a href="https://www.gsmarena.com/dxomark_the_iphone_xr_is_unrivaled_among_singlecamera_phones-news-34592.php">一向看不上DxOMark的苹果最终忍不住也来给他们塞钱了</a><br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: 我从不把手机和钥匙放在一起。唯一跟 MIX 3 放在一起的就是 Galaxy Note 4。塑料不可能划伤玻璃, 有作案能力的只剩 Note 4 可怜的两圈金属边框了。<br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: 不过我怎么艹机了来着?(<br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: 这类硬件一般在通用的第三方系统下的集成支持都远不如官方系统。若是读者认为小米的滑盖属于此列, 我只能提醒一句数位屏能提供的交互量跟滑盖应该不是在一个数量级上的。<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: 某爱国厂 —— shame on you!<br></span><span class="TText"><a id="note15" href="#n15">[15]</a>: <a href="https://en.miui.com/forum.php?mod=viewthread&tid=3806453&highlight=bootloader%2Bunlock%2B72%2Bhours">[1]</a> <a href="https://www.miui.com/forum.php?mod=viewthread&tid=21323385&highlight=%E8%A7%A3%E9%94%81%2Bbootloader">[2]</a> <a href="https://www.miui.com/forum.php?mod=viewthread&tid=18163530&highlight=%E8%A7%A3%E9%94%81%2Bbootloader">[3]</a> <br></span><span class="TText"><a id="note16" href="#n16">[16]</a>: 后来我还去小米之家把所有展示机看了一遍,三台小米 MIX 3 里只有一台没有此选项, 其他机型的展示机基本都有<br></span><span class="TText"><a id="note17" href="#n17">[17]</a>: 小米 MIX 3 不是使用 A/B 分区模式的设备, 但是因为 Android Pie 出现之前 Android 要求采用 A/B Update 的设备合并 ramdisk (/) 和 /system (即 <a href="https://source.android.com/devices/bootloader/system-as-root">System-as-root</a>), 所以 Treble GSI 的开发者直接使用 a/ab 来区分 system 镜像是否包含 ramdisk。 而 Android Pie 发布后,Android 要求所有发布时搭载 Android Pie 的设备使用 System-as-root 分区方案。 所以这里也需要用标注为 ab 的GSI镜像。<br></span><span class="TText"><a id="note18" href="#n18">[18]</a>: <s>其实插个登机牌什么的还挺有用的</s><a id="n19" href="#note19" class="note">[19]</a><br></span><span class="TText"><a id="note19" href="#n19">[19]</a>: 。<br></span></div> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <del>听音乐只能听到_Hi_-hat,所以是_Hi_-Res +Audio(</del><br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: 圆角屏幕并不在此列<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: 将符合上面三条的手机筛选出来,你会发现某水果公司生产的奢侈品赫然在列。 +当然原因并不全是因为我是 “Apple +Hater”,主要还是对其他厂商无故跟风的嫌弃(<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: <s>主要是不想要一台比旧手机屏幕更差的新机(</s><br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: <del>全怪苹果恶意哄抬物价</del> +尽管三星的旧机型价格跳水仍然很厉害,然而这次不太想买过时平台的机型了。<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: 我曾经宣称到手就会吧屏幕用502粘起来, +但是现在发现玩起来找回了当年玩高中同学的 Nokia X3 +的感觉(lbz是不是打喷嚏了),所以就没有粘。<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: 有人能告诉我这个东西是怎么被硬生生地从无到有造出来的吗?<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: 实际价值<10元<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: 非官方系统 (LineageOS 15.1)<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: <a href="https://www.gsmarena.com/dxomark_the_iphone_xr_is_unrivaled_among_singlecamera_phones-news-34592.php">一向看不上DxOMark的苹果最终忍不住也来给他们塞钱了</a><br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: 我从不把手机和钥匙放在一起。唯一跟 MIX 3 放在一起的就是 Galaxy +Note 4。塑料不可能划伤玻璃, 有作案能力的只剩 Note 4 +可怜的两圈金属边框了。<br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: 不过我怎么艹机了来着?(<br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: 这类硬件一般在通用的第三方系统下的集成支持都远不如官方系统。若是读者认为小米的滑盖属于此列, +我只能提醒一句数位屏能提供的交互量跟滑盖应该不是在一个数量级上的。<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: 某爱国厂 —— shame on you!<br></span><span class="TText"><a id="note15" href="#n15">[15]</a>: <a href="https://en.miui.com/forum.php?mod=viewthread&tid=3806453&highlight=bootloader%2Bunlock%2B72%2Bhours">[1]</a> +<a href="https://www.miui.com/forum.php?mod=viewthread&tid=21323385&highlight=%E8%A7%A3%E9%94%81%2Bbootloader">[2]</a> +<a href="https://www.miui.com/forum.php?mod=viewthread&tid=18163530&highlight=%E8%A7%A3%E9%94%81%2Bbootloader">[3]</a> +<br></span><span class="TText"><a id="note16" href="#n16">[16]</a>: 后来我还去小米之家把所有展示机看了一遍,三台小米 MIX 3 +里只有一台没有此选项, +其他机型的展示机基本都有<br></span><span class="TText"><a id="note17" href="#n17">[17]</a>: 小米 MIX 3 不是使用 A/B 分区模式的设备, 但是因为 +Android Pie 出现之前 Android 要求采用 A/B Update 的设备合并 ramdisk (/) +和 /system (即 <a href="https://source.android.com/devices/bootloader/system-as-root">System-as-root</a>), +所以 Treble GSI 的开发者直接使用 a/ab 来区分 system 镜像是否包含 +ramdisk。 而 Android Pie 发布后,Android 要求所有发布时搭载 Android Pie +的设备使用 System-as-root 分区方案。 所以这里也需要用标注为 ab +的GSI镜像。<br></span><span class="TText"><a id="note18" href="#n18">[18]</a>: <s>其实插个登机牌什么的还挺有用的</s><a id="n19" href="#note19" class="note">[19]</a><br></span><span class="TText"><a id="note19" href="#n19">[19]</a>: 。<br></span></div> <div id="insanch" style="height:3em;"></div> <div id="footer" style=""> <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> diff --git a/blog/post/2019-02-13.html b/blog/post/2019-02-13.html index 64094ee..65f4150 100644 --- a/blog/post/2019-02-13.html +++ b/blog/post/2019-02-13.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -81,7 +49,10 @@ loadTheme(); <li id="tocouter"> <span>Table of Contents</span> <ul id="tocroot"> - <li><a class="toctarg" href="#tocanch0">Mirror in Japan</a></li><li><a class="toctarg" href="#tocanch1">An Eruditus from Waseda and An Illiterate in China</a></li><li><a class="toctarg" href="#tocanch2">A world in which everyone can program</a></li><li><a class="toctarg" href="#tocanch3">The world of smartphone...</a></li><li><a class="toctarg" href="#tocanch4">Googlephobia</a></li><li><a class="toctarg" href="#tocanch5">Software Subscription Model Sucks</a></li></ul> + <li><a class="toctarg" href="#tocanch0">Mirror in Japan</a></li><li><a class="toctarg" href="#tocanch1">An Eruditus +from Waseda and An Illiterate in China</a></li><li><a class="toctarg" href="#tocanch2">A world in which everyone +can program</a></li><li><a class="toctarg" href="#tocanch3">The world of smartphone…</a></li><li><a class="toctarg" href="#tocanch4">Googlephobia</a></li><li><a class="toctarg" href="#tocanch5">Software Subscription Model +Sucks</a></li></ul> </li> <li style="margin-left:-0.5em"><a id="prevp" href="2018-12-06.html">Prev post</a></li> <li style="margin-left:-0.5em"><a id="nextp" href="2019-04-25.html">Next post</a></li> @@ -91,49 +62,120 @@ loadTheme(); <h2 id="titleh" class="TText" style="font-wight:normal;">Site Revamp and Other Rants -- 2019 Edition</h2> <div id="datetags" class="TText" style="margin-bottom:1em;">2019-02-13<br>#web #random-xp #garbage</div> <hr><div id="article" class="TText"><article> -<p>If you are reading this, your browser probably fetched all data it required to display the page directly from my VPS hosted by ConoHa.</p> +<p>If you are reading this, your browser probably fetched all data it +required to display the page directly from my VPS hosted by ConoHa.</p> <h2 id="tocanch0" class="tvis">Mirror in Japan</h2> <p>(No pun intended)</p> -<p>I set up my own git server half a year ago. Now I've found <a href="https://cgit.chrisoft.org/web.git/">the perfect use for it</a>. I create the git repository right in <code>/var/www/html</code> on my local server. The remote server has a post-receive hook that automatically pulls in the document root. Any volatile large files are moved to a new virtual host <code>filestorage.chrisoft.org</code> and kept in sync with <code>rsync</code>.</p> -<p>The site also underwent a major cleanup. Many legacy stuff got either removed or relocated.</p> -<p>Generally this means you should experience major speedup visiting this site. If, however, you are exeriencing problems, please do not hesitate to contact me.</p> -<p>The reverse proxy is now moved to <code>rp.chrisoft.org</code>. It's not yet accessible at the time of writing because my local server is hidden super stealthily under multiple layers of NAT.</p> -<h2 id="tocanch1" class="tvis">An Eruditus from Waseda and An Illiterate in China</h2> +<p>I set up my own git server half a year ago. Now I’ve found <a href="https://cgit.chrisoft.org/web.git/">the perfect use for it</a>. I +create the git repository right in <code>/var/www/html</code> on my +local server. The remote server has a post-receive hook that +automatically pulls in the document root. Any volatile large files are +moved to a new virtual host <code>filestorage.chrisoft.org</code> and +kept in sync with <code>rsync</code>.</p> +<p>The site also underwent a major cleanup. Many legacy stuff got either +removed or relocated.</p> +<p>Generally this means you should experience major speedup visiting +this site. If, however, you are exeriencing problems, please do not +hesitate to contact me.</p> +<p>The reverse proxy is now moved to <code>rp.chrisoft.org</code>. It’s +not yet accessible at the time of writing because my local server is +hidden super stealthily under multiple layers of NAT.</p> +<h2 id="tocanch1" class="tvis">An Eruditus +from Waseda and An Illiterate in China</h2> <p>Everyone except me has made significant progress.</p> -<p>I was actually shocked to learn that he's now majoring in something related to aviation machinery.</p> +<p>I was actually shocked to learn that he’s now majoring in something +related to aviation machinery.</p> <p>Shame on me, I guess.</p> -<h2 id="tocanch2" class="tvis">A world in which everyone can program</h2> +<h2 id="tocanch2" class="tvis">A world in which everyone +can program</h2> <p>I shall probably quit programming and move on by then.</p> -<h2 id="tocanch3" class="tvis">The world of smartphone...</h2> -<p>... is now a wasteland. Literally all flagship models are mutants from the Chernobyl exclusion zone.</p> +<h2 id="tocanch3" class="tvis">The world of smartphone…</h2> +<p>… is now a wasteland. Literally all flagship models are mutants from +the Chernobyl exclusion zone.</p> <h2 id="tocanch4" class="tvis">Googlephobia</h2> <p>Shit. They are probably also watching me writing this.</p> -<p>Thanks to (?) the GrandeFreakWitless, my reliance on Google is not that strong -- nope. It's actually my general fear and distrust of those tech giants.</p> -<p>My fear was magnified by my recent findings of just how much Google knows about me -- they probably know me better than myself; and again by Louis Rossmann <a id="n1" href="#note1" class="note">[1]</a>.</p> -<p>When those Google fanboys are still enjoying the great convenience they provide, I'm already planning to flee from Google. It's probably just me being hyperallergic, but it also could be Google doing something really unfair to their users.</p> -<h2 id="tocanch5" class="tvis">Software Subscription Model Sucks</h2> -<p>Reading through Roland Cloud's product page triggers me everytime: I sincerely cannot figure out why they make it a subscription service rather than a one-time purchase (with a fee for each upgrade).</p> +<p>Thanks to (?) the GrandeFreakWitless, my reliance on Google is not +that strong – nope. It’s actually my general fear and distrust of those +tech giants.</p> +<p>My fear was magnified by my recent findings of just how much Google +knows about me – they probably know me better than myself; and again by +Louis Rossmann <a id="n1" href="#note1" class="note">[1]</a>.</p> +<p>When those Google fanboys are still enjoying the great convenience +they provide, I’m already planning to flee from Google. It’s probably +just me being hyperallergic, but it also could be Google doing something +really unfair to their users.</p> +<h2 id="tocanch5" class="tvis">Software Subscription Model +Sucks</h2> +<p>Reading through Roland Cloud’s product page triggers me everytime: I +sincerely cannot figure out why they make it a subscription service +rather than a one-time purchase (with a fee for each upgrade).</p> <p>Usually people subscribe for:</p> <ul> -<li>Publication or media services, e.g. television, newspapers and magazines. These services provide frequently updated information to the subscriber.</li> +<li>Publication or media services, e.g. television, newspapers and +magazines. These services provide frequently updated information to the +subscriber.</li> <li>Physically consumable material, such as dairy product.</li> </ul> -<p>Roland Cloud falls into neither of these two categories. It's not updated as frequent, and it's certainly not physically consumable. The most triggering detail is that if you end your subscription, you will not be able to use any of the products you previously owned, which is ridiculous because you can always keep older issues of a newspaper even you unsubscribed from it.</p> -<p>Supporters of the subscription model may reject me saying 'if you can get access to everything when you join and keep it after unsubscribing, you are essentially purchasing it with ultra-low price', which brings up my next point: Roland Cloud's subscription model is flawed from the beginning:</p> +<p>Roland Cloud falls into neither of these two categories. It’s not +updated as frequent, and it’s certainly not physically consumable. The +most triggering detail is that if you end your subscription, you will +not be able to use any of the products you previously owned, which is +ridiculous because you can always keep older issues of a newspaper even +you unsubscribed from it.</p> +<p>Supporters of the subscription model may reject me saying ‘if you can +get access to everything when you join and keep it after unsubscribing, +you are essentially purchasing it with ultra-low price’, which brings up +my next point: Roland Cloud’s subscription model is flawed from the +beginning:</p> <ul> -<li>Get everything on subscribe: this differs from traditional subscription a lot, which seems a great bounty to the customer. But it causes problems such as ...</li> -<li>Lose everything on unsubscribe: this is <em>very</em> unfair to the subscriber and makes short-term subscription worth almost nothing. For example if I just want Sound Canvas VA really badly, I would imagine subscribing shortly before its release and unsubscribe after I'm eligible for keeping the product permanently. But this is simply not possible.</li> -<li>Weird pricing. To be honest the current pricing is pretty fair for long-term subscribers. But if Roland somehow decided to fix the 'lose everything on unsubscribe' problem (which is very unlikely to happen), the pricing would become super complex: they probably do not want people to keep a virtual TB-303 for just $19.99.</li> -<li>Potentially unsustainable. Every good thing must come to an end. The most attractive products in Roland Cloud is the software models of Roland's synthesizers from its golden years. But Roland will run out of models to recreate one day. What would Roland do by then? Release everything as a one-time purchase so that every long-term subscriber feels ripped off?</li> +<li>Get everything on subscribe: this differs from traditional +subscription a lot, which seems a great bounty to the customer. But it +causes problems such as …</li> +<li>Lose everything on unsubscribe: this is <em>very</em> unfair to the +subscriber and makes short-term subscription worth almost nothing. For +example if I just want Sound Canvas VA really badly, I would imagine +subscribing shortly before its release and unsubscribe after I’m +eligible for keeping the product permanently. But this is simply not +possible.</li> +<li>Weird pricing. To be honest the current pricing is pretty fair for +long-term subscribers. But if Roland somehow decided to fix the ‘lose +everything on unsubscribe’ problem (which is very unlikely to happen), +the pricing would become super complex: they probably do not want people +to keep a virtual TB-303 for just $19.99.</li> +<li>Potentially unsustainable. Every good thing must come to an end. The +most attractive products in Roland Cloud is the software models of +Roland’s synthesizers from its golden years. But Roland will run out of +models to recreate one day. What would Roland do by then? Release +everything as a one-time purchase so that every long-term subscriber +feels ripped off?</li> </ul> -<p>I'm an absolute supporter of Roland releasing authentic-sounding digitialized version of their legendary synthesizer models. But their subscription model pisses me off so hard. I know it's not a big deal for a professional producer. However this is a real deal-breaker for amateurs such as me.</p> -<p>Unfortunately there's no real competitors out there when things come to reproducing their own synthesizers. Also a little bit off-topic: the music producing industry deserves more high quality free (as in freedom) software.</p> -<p>Now let's move on and talk about Office 365 by Microsoft and Creative Cloud from Adobe. They bundles software with value-add services such as e-mail service and (optinal) creativity material. IMHO these products they are trying to turn into a service resemble a tool, such as a screwdriver, rather than an apartment that people actually go for renting instead of purchasing.</p> -<p>Paying a monthly fee for a screwdriver makes absolutely no sense. That said, I would stick with my plain old screwdriver, rather than that shiny gold-plated screwdriver with 10 heads which I will lose whenever I stop paying them. <strong>Green is my pepper.</strong></p> -<p>The purpose of this entire rant is to remind the reader of just how many ways proprietary software vendors could come up with to screw their users up. What they care the most has always been money and this will simply not change any time soon. Get ready for more!</p> +<p>I’m an absolute supporter of Roland releasing authentic-sounding +digitialized version of their legendary synthesizer models. But their +subscription model pisses me off so hard. I know it’s not a big deal for +a professional producer. However this is a real deal-breaker for +amateurs such as me.</p> +<p>Unfortunately there’s no real competitors out there when things come +to reproducing their own synthesizers. Also a little bit off-topic: the +music producing industry deserves more high quality free (as in freedom) +software.</p> +<p>Now let’s move on and talk about Office 365 by Microsoft and Creative +Cloud from Adobe. They bundles software with value-add services such as +e-mail service and (optinal) creativity material. IMHO these products +they are trying to turn into a service resemble a tool, such as a +screwdriver, rather than an apartment that people actually go for +renting instead of purchasing.</p> +<p>Paying a monthly fee for a screwdriver makes absolutely no sense. +That said, I would stick with my plain old screwdriver, rather than that +shiny gold-plated screwdriver with 10 heads which I will lose whenever I +stop paying them. <strong>Green is my pepper.</strong></p> +<p>The purpose of this entire rant is to remind the reader of just how +many ways proprietary software vendors could come up with to screw their +users up. What they care the most has always been money and this will +simply not change any time soon. Get ready for more!</p> </article> </div><br><hr> - <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <a href="https://vimeo.com/329297480">link to video</a><br></span></div> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: <a href="https://vimeo.com/329297480">link to +video</a><br></span></div> <div id="insanch" style="height:3em;"></div> <div id="footer" style=""> <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> diff --git a/blog/post/2019-04-25.html b/blog/post/2019-04-25.html index 8d9a13a..443ea7b 100644 --- a/blog/post/2019-04-25.html +++ b/blog/post/2019-04-25.html @@ -49,7 +49,10 @@ function ol() <li id="tocouter"> <span>Table of Contents</span> <ul id="tocroot"> - <li><a class="toctarg" href="#tocanch0"><em>STUDIO Canvas</em> acquired</a></li><li><a class="toctarg" href="#tocanch1">The configuration</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">Connection to the computer</a></li><li><a class="toctarg" href="#tocanch3">Settings things up in Linux</a></li><li><a class="toctarg" href="#tocanch4">Setting things up in Windows</a></li></ul></li><li><a class="toctarg" href="#tocanch5">What does it sound like?</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch6">Relation to EDIROL HyperCanvas and the Cakewalk TTS-1</a></li><li><a class="toctarg" href="#tocanch7">UPDATE: 2019-10-12</a></li></ul></li><li><a class="toctarg" href="#tocanch8">Working with the SD-80</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch9">Fighting against latency</a></li><li><a class="toctarg" href="#tocanch10">Recording</a></li><li><a class="toctarg" href="#tocanch11">Editing the sounds</a></li><li><a class="toctarg" href="#tocanch12">Impact on the workflow</a></li></ul></li><li><a class="toctarg" href="#tocanch13">Quirks</a></li><li><a class="toctarg" href="#tocanch14">Beneath the chassis</a></li><li><a class="toctarg" href="#tocanch15">What the manual doesn’t tell</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch16">Testing mode</a></li><li><a class="toctarg" href="#tocanch17">Messing around sans the chassis</a></li><li><a class="toctarg" href="#tocanch18">Chart A</a></li><li><a class="toctarg" href="#tocanch19">Chart B</a></li></ul></li><li><a class="toctarg" href="#tocanch20">Verdict</a></li><li><a class="toctarg" href="#tocanch21">Things to do besides imitating ZUN</a></li><li><a class="toctarg" href="#tocanch22">Newer Roland sound modules?</a></li><li><a class="toctarg" href="#tocanch23">Trivia</a></li><li><a class="toctarg" href="#tocanch24">If you want to learn more …</a></li></ul> + <li><a class="toctarg" href="#tocanch0"><em>STUDIO Canvas</em> acquired</a></li><li><a class="toctarg" href="#tocanch1">The configuration</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">Connection to the computer</a></li><li><a class="toctarg" href="#tocanch3">Settings things up in Linux</a></li><li><a class="toctarg" href="#tocanch4">Setting things up in Windows</a></li></ul></li><li><a class="toctarg" href="#tocanch5">What does it sound like?</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch6">Relation +to EDIROL HyperCanvas and the Cakewalk TTS-1</a></li><li><a class="toctarg" href="#tocanch7">UPDATE: 2019-10-12</a></li></ul></li><li><a class="toctarg" href="#tocanch8">Working with the SD-80</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch9">Fighting against latency</a></li><li><a class="toctarg" href="#tocanch10">Recording</a></li><li><a class="toctarg" href="#tocanch11">Editing the sounds</a></li><li><a class="toctarg" href="#tocanch12">Impact on the workflow</a></li></ul></li><li><a class="toctarg" href="#tocanch13">Quirks</a></li><li><a class="toctarg" href="#tocanch14">Beneath the chassis</a></li><li><a class="toctarg" href="#tocanch15">What the manual doesn’t tell</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch16">Testing mode</a></li><li><a class="toctarg" href="#tocanch17">Messing around sans the +chassis</a></li><li><a class="toctarg" href="#tocanch18">Chart A</a></li><li><a class="toctarg" href="#tocanch19">Chart B</a></li></ul></li><li><a class="toctarg" href="#tocanch20">Verdict</a></li><li><a class="toctarg" href="#tocanch21">Things to do besides +imitating ZUN</a></li><li><a class="toctarg" href="#tocanch22">Newer Roland sound modules?</a></li><li><a class="toctarg" href="#tocanch23">Trivia</a></li><li><a class="toctarg" href="#tocanch24">If you want to learn more …</a></li></ul> </li> <li style="margin-left:-0.5em"><a id="prevp" href="2019-02-13.html">Prev post</a></li> <li style="margin-left:-0.5em"><a id="nextp" href="2019-09-04.html">Next post</a></li> @@ -118,15 +121,54 @@ for(let x of al) }); </script> <article> -<p>This article is about my hands on of the EDIROL STUDIO Canvas SD-80. Even though I’m a newcomer to the STUDIO Canvas owners community, veterans may still find something interesting here.</p> +<p>This article is about my hands on of the EDIROL STUDIO Canvas SD-80. +Even though I’m a newcomer to the STUDIO Canvas owners community, +veterans may still find something interesting here.</p> <p><strong>UPDATE</strong>: links to board shots are fixed.</p> -<p><strong>UPDATE</strong>: <a href="https://chrisoft.org/blog/post/2020-11-20.html">A sequel</a> to this article has been posted. The sequel contains new updates, discoveries and corrections to this article.</p> -<p><strong>UPDATE</strong> (2022-06-30): the sequel is now <em>actually</em> published.</p> +<p><strong>UPDATE</strong>: <a href="https://chrisoft.org/blog/post/2020-11-20.html">A sequel</a> to +this article has been posted. The sequel contains new updates, +discoveries and corrections to this article.</p> +<p><strong>UPDATE</strong> (2022-06-30): the sequel is now +<em>actually</em> published.</p> <h2 id="tocanch0" class="tvis"><em>STUDIO Canvas</em> acquired</h2> -<p>Ever since I learned that ZUN uses a SD-90 as one of his major synthesizers <a href="https://www12.atwiki.jp/touhousoundfont/pages/22.html">here</a>, I’ve always been dreaming to get my hands on one of those. But these things are not particularly easy to find in China. There are plenty of deals on ebay though. However, after a failed purchase attempt made in 2016 which also led to the ridiculous suspension of my ebay account, I left the idea alone for multiple years. Things changed earlier this month, when <a href="https://owner203.com">owner203</a> helped me acquire my very own SD-80 and kindly delivered it from Japan.</p> -<p>I did not go for a SD-90 since they are all ridiculously priced in 2019. The deal I tried to make back in 2016 would cost me around $300 (shipping included). Now they are all way beyond $400. This forced me to resort to lower-end models, namely the SD-80 and SD-20. There’s also the SD-50 which I almost bought back in 2014, before I found out it is essentially a stripped-down version of Roland SonicCell without the SRX expandability. Therefore although the SD-50 retains the compatibility with the synth engine found in SD-90 (both are from models supporting SRX, namely the XV-5080 and SonicCell), it comes with a complete new set of waveforms and patches which makes it sounds totally different. So the SD-50 is definitely a no go.</p> -<p>The only choices left are SD-80 and SD-20. SD-20 can be found very cheap online (from $59). However SD-20 does have half of the polyphony and most editability of other STUDIO Canvas’ axed. Also gone are 3 entire sound banks (and presumably some waveforms). On the other hand, SD-80 costs a lot more (starting from ~$200), but is capable of generating everything the SD-90 can (the only missing part in SD-80 compared to SD-90 is the audio interface). After deciding no more compromise should be made, I went straight for the SD-80.</p> -<p>The module arrived two weeks after the order was placed. It certainly wasn’t the happiest SD-80 in the world: the chassis bears quite a lot of scratches all around. The value knob takes a lot of force to turn and has a good amount of friction on it, to which I found a quick solution by simply pushing the knob downwards a little bit while turning it. Aside from the looks, the module itself is in perfect working order. It came with a power cord and its rack mount ears, but without any of its original paperwork or the CD-ROM. As most of the documentation and drivers can be found online, the only things I’ve lost are the demo midi files, which is still a shame.</p> +<p>Ever since I learned that ZUN uses a SD-90 as one of his major +synthesizers <a href="https://www12.atwiki.jp/touhousoundfont/pages/22.html">here</a>, +I’ve always been dreaming to get my hands on one of those. But these +things are not particularly easy to find in China. There are plenty of +deals on ebay though. However, after a failed purchase attempt made in +2016 which also led to the ridiculous suspension of my ebay account, I +left the idea alone for multiple years. Things changed earlier this +month, when <a href="https://owner203.com">owner203</a> helped me +acquire my very own SD-80 and kindly delivered it from Japan.</p> +<p>I did not go for a SD-90 since they are all ridiculously priced in +2019. The deal I tried to make back in 2016 would cost me around $300 +(shipping included). Now they are all way beyond $400. This forced me to +resort to lower-end models, namely the SD-80 and SD-20. There’s also the +SD-50 which I almost bought back in 2014, before I found out it is +essentially a stripped-down version of Roland SonicCell without the SRX +expandability. Therefore although the SD-50 retains the compatibility +with the synth engine found in SD-90 (both are from models supporting +SRX, namely the XV-5080 and SonicCell), it comes with a complete new set +of waveforms and patches which makes it sounds totally different. So the +SD-50 is definitely a no go.</p> +<p>The only choices left are SD-80 and SD-20. SD-20 can be found very +cheap online (from $59). However SD-20 does have half of the polyphony +and most editability of other STUDIO Canvas’ axed. Also gone are 3 +entire sound banks (and presumably some waveforms). On the other hand, +SD-80 costs a lot more (starting from ~$200), but is capable of +generating everything the SD-90 can (the only missing part in SD-80 +compared to SD-90 is the audio interface). After deciding no more +compromise should be made, I went straight for the SD-80.</p> +<p>The module arrived two weeks after the order was placed. It certainly +wasn’t the happiest SD-80 in the world: the chassis bears quite a lot of +scratches all around. The value knob takes a lot of force to turn and +has a good amount of friction on it, to which I found a quick solution +by simply pushing the knob downwards a little bit while turning it. +Aside from the looks, the module itself is in perfect working order. It +came with a power cord and its rack mount ears, but without any of its +original paperwork or the CD-ROM. As most of the documentation and +drivers can be found online, the only things I’ve lost are the demo midi +files, which is still a shame.</p> <table> <tbody><tr> <td> @@ -136,80 +178,154 @@ for(let x of al) </td> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/SD-80_label.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_SD-80_label.jpg"></a> <br>Label with S/N removed. Visible on top left corner is a foot pad that seems to be a slice of cork. +<a href="//filestorage.chrisoft.org/blog/img/SD-80_label.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_SD-80_label.jpg"></a> <br>Label with S/N +removed. Visible on top left corner is a foot pad that seems to be a +slice of cork. </div> </td> </tr> <tr> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/SD-80_front.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_SD-80_front.jpg"></a> <br>Left half of the front panel. Buttons yellowed out, showing the module’s age. Scratches and dents are visible. +<a href="//filestorage.chrisoft.org/blog/img/SD-80_front.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_SD-80_front.jpg"></a> <br>Left half of +the front panel. Buttons yellowed out, showing the module’s age. +Scratches and dents are visible. </div> </td> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/SD-80_back.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_SD-80_back.jpg"></a> <br>Wow! Such Optical! Much MIDI! +<a href="//filestorage.chrisoft.org/blog/img/SD-80_back.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_SD-80_back.jpg"></a> <br>Wow! Such +Optical! Much MIDI! </div> </td> </tr> </tbody></table> <h2 id="tocanch1" class="tvis">The configuration</h2> <h3 id="tocanch2" class="tvis">Connection to the computer</h3> -<p>Without the audio interface portion, it’s impossible to use the SD-80 with only a USB connection: you need something for it to connect to in order to make a recording.</p> -<p>To begin with, I wanted to get something that accepts S/PDIF input for the audio interface. But those kind of things are scarce today. The closet model I could find in Chinese market was from an unknown vendor and comes with a very sketchy chip, whose official driver only supports up to Windows 7 32-bit. As a crappy digital interface may sound worse than a more decent analog one, I went for one of the cheapest audio interfaces available: a Focusrite Scarlett Solo (which is more than 5 times the price of the weird digital interface and probably still better than the one comes with SD-90 as it supports up to 192 KHz sampling rate).</p> -<p>For a audio equipment novice, connecting things up wasn’t that straightforward: I tried connecting the phone output on the SD-80 to the line in of the audio interface and it kind of works. There is just one <em>tiny</em> problem: the left and right channels got mixed up into one, and is only on the right channel in a stereo recording. At first I thought it was my cable. But after a couple minutes of researching, I found out that every input on an audio interface is actually mono. <strong>WHY</strong>? Guess I’ll never know.</p> -<p>So I got another TRS to XLR connector. After connecting the left channel of output 1 on the SD-80 to the microphone input on the audio interface and the right channel to line level input, it produces stereo recordings as expected. The resulting audio is very unbalanced though, due to the microphone input being much more sensitive than the line level input. In order to balance them I played a sine wave on the SD-80 and adjust the input level of each channel so that while turning down the volume knob on the SD-80, the level indicators on all channels stop blinking at the same time.</p> -<p>The ‘direct monitor’ switch on Scarlett Solo enables live monitoring of the input without operating system intervention and therefore, without latency. However the direct monitor feature on Scarlett Solo is limited to mono only, so in order to get stereo monitoring, a round-trip through the computer is required.</p> +<p>Without the audio interface portion, it’s impossible to use the SD-80 +with only a USB connection: you need something for it to connect to in +order to make a recording.</p> +<p>To begin with, I wanted to get something that accepts S/PDIF input +for the audio interface. But those kind of things are scarce today. The +closet model I could find in Chinese market was from an unknown vendor +and comes with a very sketchy chip, whose official driver only supports +up to Windows 7 32-bit. As a crappy digital interface may sound worse +than a more decent analog one, I went for one of the cheapest audio +interfaces available: a Focusrite Scarlett Solo (which is more than 5 +times the price of the weird digital interface and probably still better +than the one comes with SD-90 as it supports up to 192 KHz sampling +rate).</p> +<p>For a audio equipment novice, connecting things up wasn’t that +straightforward: I tried connecting the phone output on the SD-80 to the +line in of the audio interface and it kind of works. There is just one +<em>tiny</em> problem: the left and right channels got mixed up into +one, and is only on the right channel in a stereo recording. At first I +thought it was my cable. But after a couple minutes of researching, I +found out that every input on an audio interface is actually mono. +<strong>WHY</strong>? Guess I’ll never know.</p> +<p>So I got another TRS to XLR connector. After connecting the left +channel of output 1 on the SD-80 to the microphone input on the audio +interface and the right channel to line level input, it produces stereo +recordings as expected. The resulting audio is very unbalanced though, +due to the microphone input being much more sensitive than the line +level input. In order to balance them I played a sine wave on the SD-80 +and adjust the input level of each channel so that while turning down +the volume knob on the SD-80, the level indicators on all channels stop +blinking at the same time.</p> +<p>The ‘direct monitor’ switch on Scarlett Solo enables live monitoring +of the input without operating system intervention and therefore, +without latency. However the direct monitor feature on Scarlett Solo is +limited to mono only, so in order to get stereo monitoring, a round-trip +through the computer is required.</p> <h3 id="tocanch3" class="tvis">Settings things up in Linux</h3> -<p>If you are absolutely insane and using Gentoo Linux just like me, make sure you’ve already got working audio and have the following kernel configuration items enabled:</p> +<p>If you are absolutely insane and using Gentoo Linux just like me, +make sure you’ve already got working audio and have the following kernel +configuration items enabled:</p> <pre><code>Device Drivers ---> <*> Sound card support <*> Advanced Linux Sound Architecture ---> [*] USB sound devices <*> USB Audio/MIDI driver</code></pre> -<p>Both SD-80 and Scarlett Solo should then just work out of box (if you are using pulseaudio <a id="n1" href="#note1" class="note">[1]</a>).</p> -<p>At first I thought only the ‘generic’ USB mode of SD-80 is supported by this kernel module, however it turns out the ‘vendor’ USB mode works just fine as well. It also suffers a lot less stuttering.</p> -<p>The USB vendor ID and product ID is 0582:0029. Changing the USB mode to generic makes it 0582:002a.</p> +<p>Both SD-80 and Scarlett Solo should then just work out of box (if you +are using pulseaudio <a id="n1" href="#note1" class="note">[1]</a>).</p> +<p>At first I thought only the ‘generic’ USB mode of SD-80 is supported +by this kernel module, however it turns out the ‘vendor’ USB mode works +just fine as well. It also suffers a lot less stuttering.</p> +<p>The USB vendor ID and product ID is 0582:0029. Changing the USB mode +to generic makes it 0582:002a.</p> <p>In order to monitor the input, load the loopback module first:</p> <pre><code>pactl load-module module-loopback latency_msec=1</code></pre> <p>(<code>latency_msec</code> means exactly what the name suggests)</p> <p>then move it to the audio input of the audio interface:</p> <pre><code>pacmd move-source-output 7 alsa_input.usb-Focusrite_Scarlett_Solo_USB-00.analog-stereo</code></pre> -<p>where 7 is the index of the loopback followed by the name of the input of your audio interface. Usually you can use tab completion, however if you are still unsure, you may also use a GUI utility such as <code>pavucontrol</code>.</p> -<p>I haven’t tried JACK yet. But using QjackCtl should make everything a breeze.</p> +<p>where 7 is the index of the loopback followed by the name of the +input of your audio interface. Usually you can use tab completion, +however if you are still unsure, you may also use a GUI utility such as +<code>pavucontrol</code>.</p> +<p>I haven’t tried JACK yet. But using QjackCtl should make everything a +breeze.</p> <p>The editor for SD-80 works perfectly using wine.</p> <h3 id="tocanch4" class="tvis">Setting things up in Windows</h3> -<p>Setting things up in Windows is somehow more tedious than it should be. Roland didn’t bother releasing a driver for Windows 10, but a web search indicates the driver for Windows 8/8.1 works on Windows 10 with a minor tweak. As the device works with a generic driver on Linux even when the USB mode is set to ‘vendor’, it will probably work on Windows without the Roland driver too. Although I’d rather install the official driver for Windows 8/8.1 because there is one.</p> -<p>The tweak is simple. Open up <code>RDIF1023.INF</code> in a text editor, copy everything under section <code>[Roland.NTamd64.6.2]</code> to section <code>[Roland.NTamd64.7]</code> and you are good to go. Driver signature enforcement has to be disabled as stated in the quick start manual.</p> -<p>Settings up monitoring is as simple as clicking on a checkbox in the control panel or a button in your DAW. You just don’t see one use the command prompt for this purpose on Windows.</p> +<p>Setting things up in Windows is somehow more tedious than it should +be. Roland didn’t bother releasing a driver for Windows 10, but a web +search indicates the driver for Windows 8/8.1 works on Windows 10 with a +minor tweak. As the device works with a generic driver on Linux even +when the USB mode is set to ‘vendor’, it will probably work on Windows +without the Roland driver too. Although I’d rather install the official +driver for Windows 8/8.1 because there is one.</p> +<p>The tweak is simple. Open up <code>RDIF1023.INF</code> in a text +editor, copy everything under section <code>[Roland.NTamd64.6.2]</code> +to section <code>[Roland.NTamd64.7]</code> and you are good to go. +Driver signature enforcement has to be disabled as stated in the quick +start manual.</p> +<p>Settings up monitoring is as simple as clicking on a checkbox in the +control panel or a button in your DAW. You just don’t see one use the +command prompt for this purpose on Windows.</p> <h2 id="tocanch5" class="tvis">What does it sound like?</h2> -<p>Well, it sounds super ‘ZUNish’, if you’ve ever listened to Touhou music. It’s definitely the best sounding module back in 2002 (barring those extendable modules such as XV-5080).</p> +<p>Well, it sounds super ‘ZUNish’, if you’ve ever listened to Touhou +music. It’s definitely the best sounding module back in 2002 (barring +those extendable modules such as XV-5080).</p> <div style="text-align:center"> <audio controls="" preload="none" src="//filestorage.chrisoft.org/blog/data/SD-80/clouds_SD-80.ogg"> </audio> <p>SD-80’s take on clouds.mid (an easter egg thing in Windows 95)</p> </div> -<p>All instruments are from the ‘solo’ set. The trumpet is ‘Tp.Dark vib’, which is the famous ‘Romantic Tp’ with a significant lower filter cutoff. Everything else is the basic variant.</p> +<p>All instruments are from the ‘solo’ set. The trumpet is ‘Tp.Dark +vib’, which is the famous ‘Romantic Tp’ with a significant lower filter +cutoff. Everything else is the basic variant.</p> <div style="text-align:center"> <audio controls="" preload="none" src="//filestorage.chrisoft.org/blog/data/SD-80/th06_02_SD-80.ogg"> </audio> <p>SD-80’s take on th06_02.mid</p> </div> -<p>In general the STUDIO Canvas sounds more expressive than most other tone generators, virtual or not. This is probably related to its default non-zero modulation level (10) on every part. <a id="n2" href="#note2" class="note">[2]</a> Technically this makes it GM2-incompatible as section 3.3.2 of the GM2 specification says the default value for modulation depth should be 0.</p> -<p>Also the STUDIO Canvas has a bunch of waveforms of instruments played with vibrato, which is absent on some expandable modules such as the XV-5080 <a id="n3" href="#note3" class="note">[3]</a>, making vibrato sounds much more natural than simulating with LFO modulating the pitch and other parameters.</p> -<h3 id="tocanch6" class="tvis">Relation to EDIROL HyperCanvas and the Cakewalk TTS-1</h3> -<p>There’s a rumor saying HyperCanvas and TTS-1 is essentially the ‘classical’ set from the STUDIO Canvas. And I believed the rumor has been around for quite some time. Finally I can check it out myself.</p> +<p>In general the STUDIO Canvas sounds more expressive than most other +tone generators, virtual or not. This is probably related to its default +non-zero modulation level (10) on every part. <a id="n2" href="#note2" class="note">[2]</a> Technically this makes it GM2-incompatible as +section 3.3.2 of the GM2 specification says the default value for +modulation depth should be 0.</p> +<p>Also the STUDIO Canvas has a bunch of waveforms of instruments played +with vibrato, which is absent on some expandable modules such as the +XV-5080 <a id="n3" href="#note3" class="note">[3]</a>, making vibrato sounds +much more natural than simulating with LFO modulating the pitch and +other parameters.</p> +<h3 id="tocanch6" class="tvis">Relation +to EDIROL HyperCanvas and the Cakewalk TTS-1</h3> +<p>There’s a rumor saying HyperCanvas and TTS-1 is essentially the +‘classical’ set from the STUDIO Canvas. And I believed the rumor has +been around for quite some time. Finally I can check it out myself.</p> <div style="text-align:center"> <audio controls="" preload="none" src="//filestorage.chrisoft.org/blog/data/SD-80/SD-80.ogg"> </audio> -<p>flourish.mid on SD-80 with every instrument from the ‘classical’ set and basic variant selected.</p> +<p>flourish.mid on SD-80 with every instrument from the ‘classical’ set +and basic variant selected.</p> </div> <div style="text-align:center"> <audio controls="" preload="none" src="//filestorage.chrisoft.org/blog/data/SD-80/TTS-1.ogg"> </audio> <p>flourish.mid on Cakewalk TTS-1, everything also from bank 0.</p> </div> -<p>The first impression is they do sound quite alike. But as soon as the drums kick in, you’ll find out they actually sound different.</p> +<p>The first impression is they do sound quite alike. But as soon as the +drums kick in, you’ll find out they actually sound different.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);"> <tbody><tr style="text-align:center"> @@ -315,9 +431,21 @@ Drums </tr> </tbody></table> </div> -<p>It’s quite obvious that the drums set of TTS-1 is actually taken from SC-88Pro (except Elec. Snare, which is taken from Electric Set). The piano sounds almost identical<a id="n4" href="#note4" class="note">[4]</a>. Sax, marimba and sweep pad also sounds identical. Bass seems to heve different velocity curves and guitar in TTS-1 sounds more bright.</p> -<p>Further more, if you have Super Quartet, which is also made by Edirol, you may find out they also share many similar sounds, namely ‘Rockabilly’, ‘Jazz Bass’, ‘Rock Bass’ and ‘Acoustic Set’, which correspond to ‘Rockabilly’, ‘Jazz Bass’, ‘Fingered Bs2’ and ‘St.Standard’<a id="n5" href="#note5" class="note">[5]</a>.</p> -<p>These old Edirol software synthesizers might have a very different engine compared to the XV engine found in the STUDIO Canvasses considering the DSP power of PCs of that time period. So it’s normal that the TTS-1 produces subtly different sound even when the same samples are used.</p> +<p>It’s quite obvious that the drums set of TTS-1 is actually taken from +SC-88Pro (except Elec. Snare, which is taken from Electric Set). The +piano sounds almost identical<a id="n4" href="#note4" class="note">[4]</a>. Sax, marimba and sweep pad +also sounds identical. Bass seems to heve different velocity curves and +guitar in TTS-1 sounds more bright.</p> +<p>Further more, if you have Super Quartet, which is also made by +Edirol, you may find out they also share many similar sounds, namely +‘Rockabilly’, ‘Jazz Bass’, ‘Rock Bass’ and ‘Acoustic Set’, which +correspond to ‘Rockabilly’, ‘Jazz Bass’, ‘Fingered Bs2’ and +‘St.Standard’<a id="n5" href="#note5" class="note">[5]</a>.</p> +<p>These old Edirol software synthesizers might have a very different +engine compared to the XV engine found in the STUDIO Canvasses +considering the DSP power of PCs of that time period. So it’s normal +that the TTS-1 produces subtly different sound even when the same +samples are used.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);"> <tbody><tr> @@ -329,14 +457,20 @@ Drums <td style="text-align:center"> <audio controls="" preload="none" src="//filestorage.chrisoft.org/blog/data/SD-80/Drums_SCVA.ogg"> </audio> -<br>bonus clip: Drums from flourish.mid on SOUND Canvas VA (SC-88Pro Map) +<br>bonus clip: Drums from flourish.mid on SOUND Canvas VA (SC-88Pro +Map) </td> </tr> </tbody></table> </div> -<p>SOUND Canvas VA doesn’t simulate anything it claims to perfectly, but it’s the best result someone who doesn’t physically own a SC-88Pro can achieve I guess.</p> -<p>All audio files above were recorded using Cakewalk by Bandlab. <del>The Cubase Pro purchase was just for more instruments to be added to my HALion library.</del></p> -<p>Here are more bonus clips recorded using <code>arecord</code> on Linux.</p> +<p>SOUND Canvas VA doesn’t simulate anything it claims to perfectly, but +it’s the best result someone who doesn’t physically own a SC-88Pro can +achieve I guess.</p> +<p>All audio files above were recorded using Cakewalk by Bandlab. +<del>The Cubase Pro purchase was just for more instruments to be added +to my HALion library.</del></p> +<p>Here are more bonus clips recorded using <code>arecord</code> on +Linux.</p> <div style="text-align:center"> <audio controls="" preload="none" src="//filestorage.chrisoft.org/blog/data/SD-80/th06_13_SD-80.ogg"> </audio> @@ -345,63 +479,212 @@ Drums <div style="text-align:center"> <audio controls="" preload="none" src="//filestorage.chrisoft.org/blog/data/SD-80/th06_15_SD-80.ogg"> </audio> -<p>th06_15.mid (I didn’t bother adjusting fade in value for the vibrato LFO.)</p> +<p>th06_15.mid (I didn’t bother adjusting fade in value for the vibrato +LFO.)</p> </div> -<p>And finally SD-80 in a mix, featuring two signature instruments ZUN used a lot in recent games (‘Romantic Tp’ and ‘Reed Romance’) and also ‘St.Sm Choir’.</p> +<p>And finally SD-80 in a mix, featuring two signature instruments ZUN +used a lot in recent games (‘Romantic Tp’ and ‘Reed Romance’) and also +‘St.Sm Choir’.</p> <div style="text-align:center"> <audio controls="" preload="none" src="//filestorage.chrisoft.org/music/ogg/%E6%B7%B1%E6%B5%B7%E4%B8%83%E8%8A%B1%EF%BD%9EForgotten%20Benefit_extended_remix.ogg"> </audio> <p>深海七花~Forgotten Benefit_extended_remix<br> -(Theme of stage 6 boss of <a href="http://rgbxyz.org/th_kaikeidou/top.html">Touhou Kaikeidou</a>, arranged a bit. Originally by <a href="https://blogs.yahoo.co.jp/crystalwings6">Crystalwings</a>)</p> +(Theme of stage 6 boss of <a href="http://rgbxyz.org/th_kaikeidou/top.html">Touhou Kaikeidou</a>, +arranged a bit. Originally by <a href="https://blogs.yahoo.co.jp/crystalwings6">Crystalwings</a>)</p> </div> <h3 id="tocanch7" class="tvis">UPDATE: 2019-10-12</h3> -<p>Now that I’ve been using my SD-80 for some time, I could say more about the sounds built into it.</p> -<p>Piano sounds in the SD-80 are not super compelling, mainly because it’s too bright and thin. Sure it has improved a lot since the early days, but it’s still nowhere near the real thing.</p> -<p>Guitars and basses are in a similar situation. Most of these are also nowhere near realistic. However there <em>is</em> something worth of noting in this category, which is distortion guitar. Dist guitar presets with MFX pre-applied are much more better sounding than the old plain sample-based sounds.</p> -<p>Orchestral sounds are expressive, sometimes overly expressive. There are not much variations either: no spiccato or solo pizzicato sounds. With a bit of tweaking though, symphony tracks do sound decent on the SD-80.</p> -<p>Lead sounds and pads are superb, especially those from the special sets. With the editor a lot more nice sounds could be created. A lot of presets with step modulation typical of that days could be found both built-in and on the Internet (as midi system exclusive messages).</p> -<p>Drums are half decent. Somehow I don’t really like Roland’s choice of their acoustic drum sets. I would always turn to other virtual drums for acoustic drums. Electric drum sounds are pretty good, but there are simply not enough electric drum sounds inside the SD-80.</p> -<p>Also I don’t really like how Roland arranges the sounds into 4 GM2 sound sets. This severely limits the number of different kind of instruments. For example, rather than a lot of different vocal sounds that can be found in the SC-8850, in the SD-80 we only have Voice Oohs, Voices Oohs 2, St. Vox Oohs and Enh.Vox Oohs.</p> -<p>The GS and XG lite modes don’t sound very good, which contain sounds that are more like stripped down version of its native presets than a genuine GS or XG lite synthesizer. The GS sounds are almost pathetic: it only come with the same instrument map as the SC-55, and sounds really cheap. Compatibility wise, however, the SD-80 does a nice job. It does seem to support all NRPNs and control messages of these standards (even though it sometimes screw up parameter scaling). But due to the fact that there aren’t really a lot of usable sounds in these modes, I don’t find these modes particularly useful.</p> -<p>The SD-80 has 32MB of sample content <a id="n6" href="#note6" class="note">[6]</a>, which is on par with both SC-8850 and XV-5080. This is quite surprising because some of the sounds in XV-5080 are so much more realistic than those in SD-80 or SC-8850. The XV-5080 managed to squeeze 1083 samples into the 32MB wave ROM while the SD-80 only comes with 589 samples, which are often of lower quality. I don’t quite get why Roland did this.</p> +<p>Now that I’ve been using my SD-80 for some time, I could say more +about the sounds built into it.</p> +<p>Piano sounds in the SD-80 are not super compelling, mainly because +it’s too bright and thin. Sure it has improved a lot since the early +days, but it’s still nowhere near the real thing.</p> +<p>Guitars and basses are in a similar situation. Most of these are also +nowhere near realistic. However there <em>is</em> something worth of +noting in this category, which is distortion guitar. Dist guitar presets +with MFX pre-applied are much more better sounding than the old plain +sample-based sounds.</p> +<p>Orchestral sounds are expressive, sometimes overly expressive. There +are not much variations either: no spiccato or solo pizzicato sounds. +With a bit of tweaking though, symphony tracks do sound decent on the +SD-80.</p> +<p>Lead sounds and pads are superb, especially those from the special +sets. With the editor a lot more nice sounds could be created. A lot of +presets with step modulation typical of that days could be found both +built-in and on the Internet (as midi system exclusive messages).</p> +<p>Drums are half decent. Somehow I don’t really like Roland’s choice of +their acoustic drum sets. I would always turn to other virtual drums for +acoustic drums. Electric drum sounds are pretty good, but there are +simply not enough electric drum sounds inside the SD-80.</p> +<p>Also I don’t really like how Roland arranges the sounds into 4 GM2 +sound sets. This severely limits the number of different kind of +instruments. For example, rather than a lot of different vocal sounds +that can be found in the SC-8850, in the SD-80 we only have Voice Oohs, +Voices Oohs 2, St. Vox Oohs and Enh.Vox Oohs.</p> +<p>The GS and XG lite modes don’t sound very good, which contain sounds +that are more like stripped down version of its native presets than a +genuine GS or XG lite synthesizer. The GS sounds are almost pathetic: it +only come with the same instrument map as the SC-55, and sounds really +cheap. Compatibility wise, however, the SD-80 does a nice job. It does +seem to support all NRPNs and control messages of these standards (even +though it sometimes screw up parameter scaling). But due to the fact +that there aren’t really a lot of usable sounds in these modes, I don’t +find these modes particularly useful.</p> +<p>The SD-80 has 32MB of sample content <a id="n6" href="#note6" class="note">[6]</a>, which is on par with +both SC-8850 and XV-5080. This is quite surprising because some of the +sounds in XV-5080 are so much more realistic than those in SD-80 or +SC-8850. The XV-5080 managed to squeeze 1083 samples into the 32MB wave +ROM while the SD-80 only comes with 589 samples, which are often of +lower quality. I don’t quite get why Roland did this.</p> <h2 id="tocanch8" class="tvis">Working with the SD-80</h2> <h3 id="tocanch9" class="tvis">Fighting against latency</h3> -<p>Even though Scarlett Solo can achieve a very low latency, there’s no way I can squeeze out enough processing power out of my ULV dual core i7 to handle it. Therefore I was forced to live with ~11 ms latency, which is not <em>that</em> high, but still a quite significant amount to deal with.</p> -<p>Cakewalk’s glitchy latency compensation makes things even worse: it works in some projects but completely out of order for the others. In order to listen to a full mix, I have to make a short recording, which is really annoying. As this is much more expensive time-wise, I started using more guesswork before trying a full mix and it’s probably not good.</p> +<p>Even though Scarlett Solo can achieve a very low latency, there’s no +way I can squeeze out enough processing power out of my ULV dual core i7 +to handle it. Therefore I was forced to live with ~11 ms latency, which +is not <em>that</em> high, but still a quite significant amount to deal +with.</p> +<p>Cakewalk’s glitchy latency compensation makes things even worse: it +works in some projects but completely out of order for the others. In +order to listen to a full mix, I have to make a short recording, which +is really annoying. As this is much more expensive time-wise, I started +using more guesswork before trying a full mix and it’s probably not +good.</p> <h3 id="tocanch10" class="tvis">Recording</h3> -<p>Recording is simple and works as expected. However I seem to suffer from quite a high SNR value, which hovers around ~90 dB. Perhaps it’s my crappy cables making me pay.</p> +<p>Recording is simple and works as expected. However I seem to suffer +from quite a high SNR value, which hovers around ~90 dB. Perhaps it’s my +crappy cables making me pay.</p> <h3 id="tocanch11" class="tvis">Editing the sounds</h3> -<p>The best thing about SD-80 is its editability. Neither SD-90 nor SD-20 came with the same level of editability upon launch. <a id="n7" href="#note7" class="note">[7]</a></p> -<p>As claimed by the <a href="https://www.soundonsound.com/reviews/edirol-SD80">Sound On Sound review</a>, the editor for SD-80 is very similar to the one for XV-2020. The editor exposes a generic sample-based synthesis engine quite comparable to the one found in HALion (with more restrictions, of course). It lets you take full control of the synthesis engine and even create new patches not found anywhere else.</p> -<p>The synthesis engine consists of four layers (with up to two samples <a id="n8" href="#note8" class="note">[8]</a> for each layer, plus frequency modulation), four filters (one for each layer), eight envelope generators (amplitude EG and filter EG for each layer), two LFOs <a id="n9" href="#note9" class="note">[9]</a> and a 4*4 modulation matrix. There are also 90 post-processing effects (some of which are combinations of multiple simple effects, hence the name ‘MFX’) to choose from for each channel.</p> -<p>Restrictions aforementioned include inability to use external samples so you are essentially locked in to 589 built-in waveforms (which is probably fine because it’s not what the STUDIO Canvas line is aimed at), limited number of envelope nodes, limited modulation routing, restricted number of different MFX’s that can be used at the same time (3).</p> -<p>The editor has quite terrible user experience. Guess it’s common for such decades-old software. It comes with a twenty-page pdf manual (which contains a lot of excerpts from the XV-5080 owner’s manual), which focus on the internals of the synthesizer, and a html manual, which focus on the interface of the editor.</p> -<p>I’ve also tried editor software for other STUDIO Canvas modules using the same generation of XV engine. The SD-20 editor works seamlessly with SD-80, and it only offers basic parameters editing just like TTS-1. The SD-90 editor, despite being extremely similar to the SD-20 editor, doesn’t work at all, which is not surprising as it’s essentially the SD-20 editor plus an editor for the audio mixer and audio effects processor found in the SD-90, which the SD-80 lacks.</p> -<p>By the way, if you have hi-dpi display and use Windows 10, be sure to use ‘System (Enhanced)’ scaling behavior for the SD-80 Editor. It scales perfectly that way.</p> -<p>I’m not going to scatter the post with even more pictures, so please follow the links for selected screenshots of the editor:</p> -<p><a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_a.png">main screen</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_b.png">‘part survey’</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_c.png">layers</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_e.png">amp EG</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_f.png">LFO</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_h.png">layers mapping</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_i.png">modulation matrix</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_k.png">patch options</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_l.png">‘part all’</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_m.png">MFX editing</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_r.png">Rhythm layers editor</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_u.png">Rhythm amp EG</a></p> +<p>The best thing about SD-80 is its editability. Neither SD-90 nor +SD-20 came with the same level of editability upon launch. <a id="n7" href="#note7" class="note">[7]</a></p> +<p>As claimed by the <a href="https://www.soundonsound.com/reviews/edirol-SD80">Sound On Sound +review</a>, the editor for SD-80 is very similar to the one for XV-2020. +The editor exposes a generic sample-based synthesis engine quite +comparable to the one found in HALion (with more restrictions, of +course). It lets you take full control of the synthesis engine and even +create new patches not found anywhere else.</p> +<p>The synthesis engine consists of four layers (with up to two samples +<a id="n8" href="#note8" class="note">[8]</a> for each layer, plus +frequency modulation), four filters (one for each layer), eight envelope +generators (amplitude EG and filter EG for each layer), two LFOs +<a id="n9" href="#note9" class="note">[9]</a> and a 4*4 modulation matrix. There are also 90 +post-processing effects (some of which are combinations of multiple +simple effects, hence the name ‘MFX’) to choose from for each +channel.</p> +<p>Restrictions aforementioned include inability to use external samples +so you are essentially locked in to 589 built-in waveforms (which is +probably fine because it’s not what the STUDIO Canvas line is aimed at), +limited number of envelope nodes, limited modulation routing, restricted +number of different MFX’s that can be used at the same time (3).</p> +<p>The editor has quite terrible user experience. Guess it’s common for +such decades-old software. It comes with a twenty-page pdf manual (which +contains a lot of excerpts from the XV-5080 owner’s manual), which focus +on the internals of the synthesizer, and a html manual, which focus on +the interface of the editor.</p> +<p>I’ve also tried editor software for other STUDIO Canvas modules using +the same generation of XV engine. The SD-20 editor works seamlessly with +SD-80, and it only offers basic parameters editing just like TTS-1. The +SD-90 editor, despite being extremely similar to the SD-20 editor, +doesn’t work at all, which is not surprising as it’s essentially the +SD-20 editor plus an editor for the audio mixer and audio effects +processor found in the SD-90, which the SD-80 lacks.</p> +<p>By the way, if you have hi-dpi display and use Windows 10, be sure to +use ‘System (Enhanced)’ scaling behavior for the SD-80 Editor. It scales +perfectly that way.</p> +<p>I’m not going to scatter the post with even more pictures, so please +follow the links for selected screenshots of the editor:</p> +<p><a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_a.png">main +screen</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_b.png">‘part +survey’</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_c.png">layers</a> +/ <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_e.png">amp +EG</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_f.png">LFO</a> / +<a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_h.png">layers +mapping</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_i.png">modulation +matrix</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_k.png">patch +options</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_l.png">‘part +all’</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_m.png">MFX +editing</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_r.png">Rhythm +layers editor</a> / <a href="//filestorage.chrisoft.org/blog/img/SD-80_editor_u.png">Rhythm amp +EG</a></p> <h3 id="tocanch12" class="tvis">Impact on the workflow</h3> -<p>First of all I’ve to record and thus, deal with latency, noise and clipping. It’s pretty annoying as already mentioned above.</p> -<p>Also the SD-80 doesn’t integrate very well with any DAW. There’s no way your settings of this hardware synth get saved automatically with your project like a virtual synth. Also forget about automation and all sort of things. You have to use MIDI events and system exclusive messages (especially tuning some obscure parameters) for this purpose, and DAW software doesn’t have great support for system exclusive messages in general.</p> +<p>First of all I’ve to record and thus, deal with latency, noise and +clipping. It’s pretty annoying as already mentioned above.</p> +<p>Also the SD-80 doesn’t integrate very well with any DAW. There’s no +way your settings of this hardware synth get saved automatically with +your project like a virtual synth. Also forget about automation and all +sort of things. You have to use MIDI events and system exclusive +messages (especially tuning some obscure parameters) for this purpose, +and DAW software doesn’t have great support for system exclusive +messages in general.</p> <h2 id="tocanch13" class="tvis">Quirks</h2> -<p>The SD-80 is GM2 compatible. However many midi files you randomly find may not play on it even when the device is in GM2 mode. If the midi file being played has any sort of bank selection event not recognized by the SD-80, the corresponding part will produce no sound at all.</p> -<p>If your midi file has NRPN messages, things will get even worse. These things are essentially undocumented for the SD-80. All I could say is good luck keeping your eardrum intact. <a id="n10" href="#note10" class="note">[10]</a></p> -<p>The manual says ‘This set (“classical” set) is also used when GM2 data compatibility is important’. However upon receiving the GM2 on message, the module automatically selects ‘contemporary’ set for every part. It seems impossible to change this behavior.</p> -<p>The XG Lite mode has way more instruments available than what the manual has listed. Bank 18 patch 1 gives you ‘Piano 1d’ (presumably ‘Mellow Grand Piano’ in XG specification), which is not listed in the manual. It actually has 489 normal patches, 49 sfx patches, 2 sfx kits and 9 drum kits <a id="n11" href="#note11" class="note">[11]</a>. It’s quite irony to find out that they have more patches for their competitor’s standard than their own legacy standard. However these sounds are relatively lame when compared with authentic YAMAHA XG synthesizers of the same period. Particularly some sounds in different variant slot of the same patch number sounds almost identical. Roland obvious put less effort in these sounds in terms of sound designing.</p> -<p>MIDI timing messes up if events flood in within a demisemiquaver worth of time. This quirk resembles the problem QMidiPlayer for Windows suffered from in its early days. But I’m pretty sure the cause is completely different. <a id="n12" href="#note12" class="note">[12]</a> Also this could be a common issue of old MIDI devices, as my old YAMAHA keyboards does the exact same thing.</p> -<p>The sound generated by the SD-80/90 is phasey as could be heard in ZUN’s early works. If unsure, take a look at the spectrogram.</p> -<p>The module, as all electric appliances do, generates heat. The manual says “A small amount of heat will radiate from the unit during normal operation”, and the chassis do get quite warm even when it is completely idle. This didn’t become an issue until later.</p> -<p>Finally there are a couple of quirks in Roland’s former partner Cakewalk. Whenever the input signal level exceeds 0dB, instead of clipping the audio, it produces a loud cracking or popping sound in the record. Cubase and arecord have no such problem.</p> -<p>Another quirk with Cakewalk is its metronome. Metronome settings in Cakewalk is saved on a per-project basis and there’s no way to change the default value (unless creating a template, which is useless for existing projects). By default it sends the metronome to the default MIDI device, which result in records with metronome clicks in them.</p> +<p>The SD-80 is GM2 compatible. However many midi files you randomly +find may not play on it even when the device is in GM2 mode. If the midi +file being played has any sort of bank selection event not recognized by +the SD-80, the corresponding part will produce no sound at all.</p> +<p>If your midi file has NRPN messages, things will get even worse. +These things are essentially undocumented for the SD-80. All I could say +is good luck keeping your eardrum intact. <a id="n10" href="#note10" class="note">[10]</a></p> +<p>The manual says ‘This set (“classical” set) is also used when GM2 +data compatibility is important’. However upon receiving the GM2 on +message, the module automatically selects ‘contemporary’ set for every +part. It seems impossible to change this behavior.</p> +<p>The XG Lite mode has way more instruments available than what the +manual has listed. Bank 18 patch 1 gives you ‘Piano 1d’ (presumably +‘Mellow Grand Piano’ in XG specification), which is not listed in the +manual. It actually has 489 normal patches, 49 sfx patches, 2 sfx kits +and 9 drum kits <a id="n11" href="#note11" class="note">[11]</a>. It’s quite irony to find out that they have more patches +for their competitor’s standard than their own legacy standard. However +these sounds are relatively lame when compared with authentic YAMAHA XG +synthesizers of the same period. Particularly some sounds in different +variant slot of the same patch number sounds almost identical. Roland +obvious put less effort in these sounds in terms of sound designing.</p> +<p>MIDI timing messes up if events flood in within a demisemiquaver +worth of time. This quirk resembles the problem QMidiPlayer for Windows +suffered from in its early days. But I’m pretty sure the cause is +completely different. <a id="n12" href="#note12" class="note">[12]</a> Also this could be a +common issue of old MIDI devices, as my old YAMAHA keyboards does the +exact same thing.</p> +<p>The sound generated by the SD-80/90 is phasey as could be heard in +ZUN’s early works. If unsure, take a look at the spectrogram.</p> +<p>The module, as all electric appliances do, generates heat. The manual +says “A small amount of heat will radiate from the unit during normal +operation”, and the chassis do get quite warm even when it is completely +idle. This didn’t become an issue until later.</p> +<p>Finally there are a couple of quirks in Roland’s former partner +Cakewalk. Whenever the input signal level exceeds 0dB, instead of +clipping the audio, it produces a loud cracking or popping sound in the +record. Cubase and arecord have no such problem.</p> +<p>Another quirk with Cakewalk is its metronome. Metronome settings in +Cakewalk is saved on a per-project basis and there’s no way to change +the default value (unless creating a template, which is useless for +existing projects). By default it sends the metronome to the default +MIDI device, which result in records with metronome clicks in them.</p> <h2 id="tocanch14" class="tvis">Beneath the chassis</h2> -<p>Although I cherish the module quite a lot and there are warning text on top of it (which I can’t read because it’s in Japanese and … well, English), I disassembled the unit.</p> +<p>Although I cherish the module quite a lot and there are warning text +on top of it (which I can’t read because it’s in Japanese and … well, +English), I disassembled the unit.</p> <div style="text-align:center;max-width:90%;"> -<a href="//filestorage.chrisoft.org/blog/img/SD-80_caution.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_SD-80_caution.jpg"></a> <br>CAUTION!! 注意!! ATTENTION!! (/a.tɑ̃.sjɔ̃/) +<a href="//filestorage.chrisoft.org/blog/img/SD-80_caution.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_SD-80_caution.jpg"></a> <br>CAUTION!! +注意!! ATTENTION!! (/a.tɑ̃.sjɔ̃/) </div> -<p>As most other vendors does, Roland build their audio equipment ‘like a tank’. The entire chassis is made out of aluminium and steel, and has an absolutely crazy amount of screws on it. The front panel came off after taking out 5 screws on top and bottom, after which I took out the value knob and the rubber button sheet for a cleanup.</p> -<p>The top cover was freed after taking out 11 screws. Under the top cover lies the guts of SD-80. All boards except the power supply board uses SMD components extensively. The main board is made exclusively using SMD components, which is probably quite impressive back in the early 2000s.</p> -<p>The power supply module is surrounded with thick plastic sheet presumably for insulation. Rated voltage for the module seems to be changeable by using different pin layouts on the input side. The power supply module is made of two separate boards. The two boards are connected with two wide connectors that only have a few pins on them. I would guess the pin layout on the connectors sets the rated voltage of the module but I’m not sure. I would definitely test that out someday.</p> -<p>I took note of the engravment of every chip on the main board, which could be found in chart B below.</p> +<p>As most other vendors does, Roland build their audio equipment ‘like +a tank’. The entire chassis is made out of aluminium and steel, and has +an absolutely crazy amount of screws on it. The front panel came off +after taking out 5 screws on top and bottom, after which I took out the +value knob and the rubber button sheet for a cleanup.</p> +<p>The top cover was freed after taking out 11 screws. Under the top +cover lies the guts of SD-80. All boards except the power supply board +uses SMD components extensively. The main board is made exclusively +using SMD components, which is probably quite impressive back in the +early 2000s.</p> +<p>The power supply module is surrounded with thick plastic sheet +presumably for insulation. Rated voltage for the module seems to be +changeable by using different pin layouts on the input side. The power +supply module is made of two separate boards. The two boards are +connected with two wide connectors that only have a few pins on them. I +would guess the pin layout on the connectors sets the rated voltage of +the module but I’m not sure. I would definitely test that out +someday.</p> +<p>I took note of the engravment of every chip on the main board, which +could be found in chart B below.</p> <table> <tbody><tr> <td> @@ -428,11 +711,40 @@ Drums </td></tr> </tbody></table> <h2 id="tocanch15" class="tvis">What the manual doesn’t tell</h2> -<p>A very sensible thing to do after the disassembly is to search the engravment on the chips online. Searching ‘RA08-503’ found on the largest Roland-labled chips <a id="n13" href="#note13" class="note">[13]</a> brings up a whole new world to me: service manuals for Roland synths. Sadly there are no manuals for any STUDIO Canvas models, nevertheless, they are very useful for learning more about the insides of a Roland synthesizer.</p> -<p>There are a couple of models bearing the ‘RA08-503’ chip found in the SD-80. Examples include XV-5080 and MC-909. This chip is referred to as ‘XV’ in their service manuals (also in the SD-80, as you will find out later). It’s safe to guess they handle the most important work of a sound module – tone generation. Also I observed that all modules supporting 32 parts and 128 polyphony have two of these chips in them, while the ones with only one chip only supports up to 16 parts and 64 polyphony. Maybe that’s the limitation of the single chip. Also one can tell the chip also handles some weird job such as LED indicators from the circuit board schematic.</p> -<p>A very lonely chip on the right side has ‘6417706’ on it. Turns out this is a microprocessor implementing the SuperH architecture. It’s the same CPU as found in MC-909 (which makes sense as they are produced around the same time). Linux kernel has support for this processor<a id="n14" href="#note14" class="note">[14]</a>. The processor has a maximum clock speed of 133 MHz and is underclocked to 128MHz in the MC-909. It’s probably underclocked even more in the SD-80. There’s an unpopulated D-sub connector presumably for debugging near the CPU.</p> +<p>A very sensible thing to do after the disassembly is to search the +engravment on the chips online. Searching ‘RA08-503’ found on the +largest Roland-labled chips <a id="n13" href="#note13" class="note">[13]</a> brings up a whole +new world to me: service manuals for Roland synths. Sadly there are no +manuals for any STUDIO Canvas models, nevertheless, they are very useful +for learning more about the insides of a Roland synthesizer.</p> +<p>There are a couple of models bearing the ‘RA08-503’ chip found in the +SD-80. Examples include XV-5080 and MC-909. This chip is referred to as +‘XV’ in their service manuals (also in the SD-80, as you will find out +later). It’s safe to guess they handle the most important work of a +sound module – tone generation. Also I observed that all modules +supporting 32 parts and 128 polyphony have two of these chips in them, +while the ones with only one chip only supports up to 16 parts and 64 +polyphony. Maybe that’s the limitation of the single chip. Also one can +tell the chip also handles some weird job such as LED indicators from +the circuit board schematic.</p> +<p>A very lonely chip on the right side has ‘6417706’ on it. Turns out +this is a microprocessor implementing the SuperH architecture. It’s the +same CPU as found in MC-909 (which makes sense as they are produced +around the same time). Linux kernel has support for this +processor<a id="n14" href="#note14" class="note">[14]</a>. The processor has a maximum clock speed of 133 MHz and is +underclocked to 128MHz in the MC-909. It’s probably underclocked even +more in the SD-80. There’s an unpopulated D-sub connector presumably for +debugging near the CPU.</p> <h3 id="tocanch16" class="tvis">Testing mode</h3> -<p>According to the service manuals available for other models, they all have a hidden test mode. Some also have the ability to update system firmware. Entering testing mode often involves turning the power on with a combination of keys pressed. Every model have its own way to enter testing mode and there’s no obvious pattern. At that point, I was desperate to dive into it. So I simply tried all button combinations consisting of one to three buttons. The result didn’t let me down. I found three combinations that make the SD-80 boot into special modes.</p> +<p>According to the service manuals available for other models, they all +have a hidden test mode. Some also have the ability to update system +firmware. Entering testing mode often involves turning the power on with +a combination of keys pressed. Every model have its own way to enter +testing mode and there’s no obvious pattern. At that point, I was +desperate to dive into it. So I simply tried all button combinations +consisting of one to three buttons. The result didn’t let me down. I +found three combinations that make the SD-80 boot into special +modes.</p> <ul> <li>INST + SHIFT + PART▶ = Test Mode</li> <li>INST + PAGE◀ + PREVIEW = Program Updater</li> @@ -446,35 +758,58 @@ Drums <p>(Preview blinks, pressing it doesn’t seem to do anything)</p> <pre><code>01 Device Check ALL OK!!</code></pre> -<p>(I got <code>NG:XV2</code> shortly after heavily using the module for a while. MFX in test 7 produces no sound at all, system delay only has the dry sound, everything else was normal. More on this later.)</p> +<p>(I got <code>NG:XV2</code> shortly after heavily using the module for +a while. MFX in test 7 produces no sound at all, system delay only has +the dry sound, everything else was normal. More on this later.)</p> <pre><code>02 MIDI Check MID1:x MID2:x THRU:x</code></pre> -<p>(No MIDI cable for me until I’m home… Input from USB does not count.)</p> +<p>(No MIDI cable for me until I’m home… Input from USB does not +count.)</p> <pre><code>03 LCD Check PAGE:Sel / ENC: Contr</code></pre> -<p>(PAGE buttons switch among the following four patterns: none, full, chequerboard 0, reversed chequerboard. Contr=Contrast)</p> +<p>(PAGE buttons switch among the following four patterns: none, full, +chequerboard 0, reversed chequerboard. Contr=Contrast)</p> <pre><code>04 SW/LED Check ooooo ooooo</code></pre> -<p>(All buttons and indicators light up. Transparent buttons turns off its light, opaque buttons turns off LED above or below it, ENTER button turns off nothing. The five <code>o</code>’s on the left corresponds to the upper row, others corresponds to the lower row. Pressing a button turns its character to <code>#</code>, releasing it causes it to change to <code>.</code>.)</p> +<p>(All buttons and indicators light up. Transparent buttons turns off +its light, opaque buttons turns off LED above or below it, ENTER button +turns off nothing. The five <code>o</code>’s on the left corresponds to +the upper row, others corresponds to the lower row. Pressing a button +turns its character to <code>#</code>, releasing it causes it to change +to <code>.</code>.)</p> <pre><code>05 Encoder Check Value(0-23) = xx</code></pre> -<p>(+ Plays C3, - Plays E3, both using the piano voice. Value starts at 00. Interestingly if the encoder is turned too fast, the value on screen does not change until you stop.)</p> +<p>(+ Plays C3, - Plays E3, both using the piano voice. Value starts at +00. Interestingly if the encoder is turned too fast, the value on screen +does not change until you stop.)</p> <pre><code>06 Sound Check Push button to check Left channel Center channel Right channel</code></pre> -<p>(INST/EFFECTS/SYSTEM blink, pushing one makes it constantly on while others still blinking and plays the corresponding check. Plays sine wave on the selected channel(s))</p> +<p>(INST/EFFECTS/SYSTEM blink, pushing one makes it constantly on while +others still blinking and plays the corresponding check. Plays sine wave +on the selected channel(s))</p> <pre><code>07 Effect Check Push button to check MFX(Delay) System Delay System Reverb</code></pre> -<p>(Same as test 06. The sounds used for these checks are snare, castanets and side stick respectively.)</p> +<p>(Same as test 06. The sounds used for these checks are snare, +castanets and side stick respectively.)</p> <pre><code>08 Factory Reset Push [PREVIEW]</code></pre> <p>(PREVIEW blinks, pressing it really resets!)</p> -<p>The SD-80 still works as a sound module in test mode – it will play any incoming midi stream. The module is in native mode regardless of your settings. MFX doesn’t seem to be working normally (likely due to it’s reserved for test 07). Switching between tests resets some (if not all, depending on the test switching to) of the synthesizer’s states. Switching to test 05 sets some of the instrumental parts to piano and others to a certain synth lead patch. Switching to test 06 sets sine wave and piano on all instrumental parts just like test 05. Switching to test 07 sets certain instrument parts to a drum patch, the patch ‘Xtremities’ could also be heard. Other parts are set to piano.</p> +<p>The SD-80 still works as a sound module in test mode – it will play +any incoming midi stream. The module is in native mode regardless of +your settings. MFX doesn’t seem to be working normally (likely due to +it’s reserved for test 07). Switching between tests resets some (if not +all, depending on the test switching to) of the synthesizer’s states. +Switching to test 05 sets some of the instrumental parts to piano and +others to a certain synth lead patch. Switching to test 06 sets sine +wave and piano on all instrumental parts just like test 05. Switching to +test 07 sets certain instrument parts to a drum patch, the patch +‘Xtremities’ could also be heard. Other parts are set to piano.</p> <p><strong>Program Updater</strong></p> <pre><code>Program Updater Version: 1.03</code></pre> @@ -496,17 +831,51 @@ Boot:5170[5170]1.01</code></pre> <li>PART◀ = Update by MIDI</li> <li>PART▶ = Update by USB</li> </ul> -<p>MIDI and USB indicators blink on any screen with the top row saying <code>Program Updater</code>. Selecting a source makes the corresponding indicator constantly lit and the other go out.</p> -<p>If this mode is entered with the combination SYSTEM + PAGE◀ + PREVIEW, INST, EFFECTS, SYSTEM will do nothing instead. This combination is probably reserved for consumers.</p> +<p>MIDI and USB indicators blink on any screen with the top row saying +<code>Program Updater</code>. Selecting a source makes the corresponding +indicator constantly lit and the other go out.</p> +<p>If this mode is entered with the combination SYSTEM + PAGE◀ + +PREVIEW, INST, EFFECTS, SYSTEM will do nothing instead. This combination +is probably reserved for consumers.</p> <p>Sound generation does not work in the program updater.</p> -<p>Presumably the update MIDI files are similar to earlier models: stream of system exclusive events containing firmware blobs. No program update could be found for the SD-80 on the Internet. There are update files for the SD-90 however, which updates its system software to version 1.03.</p> +<p>Presumably the update MIDI files are similar to earlier models: +stream of system exclusive events containing firmware blobs. No program +update could be found for the SD-80 on the Internet. There are update +files for the SD-90 however, which updates its system software to +version 1.03.</p> </div> -<h3 id="tocanch17" class="tvis">Messing around sans the chassis</h3> -<p>As the two XV chips are arranged in a master-slave manner, I tried figuring out which one is acting as the master. I threw a bunch of midi files at it while measuring the temperature of the XV chips… with my fingers. Both chips turn quite toasty but IC19 is always warmer than IC27, sometimes it’s even a little difficult to keep my finger stay on that chip.</p> -<p>When the action gets more intense, IC27 starts to warm up. Before I was just going to conclude that IC27 is acting as the master, I realized that I will never come into a meaningful conclusion without further reverse engineering: I have absolutely no idea how the load is distributed between the two XV’s!</p> -<p>Frustrated, I entered testing mode to find out whether there’s anything interesting if it’s run with chassis removed. To my surprise, the device check failed with <code>NG:XV2</code> and a bunch of other errors in the following tests. I thought I was doomed, but a reboot of the module solved the problem completely and it never show any trace of abnormality that day.</p> -<p>The other day, however, the problem returned. After messing with the SD-80 editor and creating random complex patches for an hour, I randomly decided to check out the testing mode again, where I was greeted by the <code>NG:XV2</code> failure the second time. Again, a reboot solved the problem for the day. No amount of hardwork will put the SD-80 into a buggy state if it boot straight into normal mode. At this point I thought it could be a bug in the test or the device check could be quite sensitive to temperature, which is probably not a very good thing as there are no vent holes for airflow on the module whatsoever.</p> -<p>A few more days, I found my SD-80 frozen after keeping it on doing almost nothing for a day. In yet another case, it just randomly froze during playback after half day of usage. I’m unsure these instability are specific to my machine.</p> +<h3 id="tocanch17" class="tvis">Messing around sans the +chassis</h3> +<p>As the two XV chips are arranged in a master-slave manner, I tried +figuring out which one is acting as the master. I threw a bunch of midi +files at it while measuring the temperature of the XV chips… with my +fingers. Both chips turn quite toasty but IC19 is always warmer than +IC27, sometimes it’s even a little difficult to keep my finger stay on +that chip.</p> +<p>When the action gets more intense, IC27 starts to warm up. Before I +was just going to conclude that IC27 is acting as the master, I realized +that I will never come into a meaningful conclusion without further +reverse engineering: I have absolutely no idea how the load is +distributed between the two XV’s!</p> +<p>Frustrated, I entered testing mode to find out whether there’s +anything interesting if it’s run with chassis removed. To my surprise, +the device check failed with <code>NG:XV2</code> and a bunch of other +errors in the following tests. I thought I was doomed, but a reboot of +the module solved the problem completely and it never show any trace of +abnormality that day.</p> +<p>The other day, however, the problem returned. After messing with the +SD-80 editor and creating random complex patches for an hour, I randomly +decided to check out the testing mode again, where I was greeted by the +<code>NG:XV2</code> failure the second time. Again, a reboot solved the +problem for the day. No amount of hardwork will put the SD-80 into a +buggy state if it boot straight into normal mode. At this point I +thought it could be a bug in the test or the device check could be quite +sensitive to temperature, which is probably not a very good thing as +there are no vent holes for airflow on the module whatsoever.</p> +<p>A few more days, I found my SD-80 frozen after keeping it on doing +almost nothing for a day. In yet another case, it just randomly froze +during playback after half day of usage. I’m unsure these instability +are specific to my machine.</p> <h3 id="tocanch18" class="tvis">Chart A</h3> <div class="collapse" data-caption="Comparison of internal components found in selected Roland devices"> <p><a id="n15" href="#note15" class="note">[15]</a></p> @@ -540,7 +909,8 @@ Boot:5170[5170]1.01</code></pre> </tr> <tr class="even"> <td style="text-align: center;">SC-88</td> -<td style="text-align: center;">MBCS30109 (Custom Sound Generator) ‘XP’</td> +<td style="text-align: center;">MBCS30109 (Custom Sound Generator) +‘XP’</td> <td style="text-align: center;"><a href="https://en.wikipedia.org/wiki/H8_Family">H8/510</a></td> <td>EPROM/Mask ROM, SRAM*2, Wave ROM*4, DRAM*2</td> <td style="text-align: center;">32</td> @@ -548,7 +918,8 @@ Boot:5170[5170]1.01</code></pre> </tr> <tr class="odd"> <td style="text-align: center;">SC-88Pro</td> -<td style="text-align: center;">RA01-005 (Custom Sound Generator) ‘XP3’</td> +<td style="text-align: center;">RA01-005 (Custom Sound Generator) +‘XP3’</td> <td style="text-align: center;"><a href="https://en.wikipedia.org/wiki/H8_Family">H8/510</a></td> <td>EPROM, SRAM*2, Wave ROM*5, DRAM*3</td> <td style="text-align: center;">32</td> @@ -558,7 +929,9 @@ Boot:5170[5170]1.01</code></pre> <td style="text-align: center;">SC-8850</td> <td style="text-align: center;">2*RA09-002 (Custom) ‘XP6’</td> <td style="text-align: center;"><a href="https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7010/sh7014.html">SH7017</a></td> -<td>64KB System ROM, 8M System Flash, 256K SRAM (USB controller), 2*4M DRAM (EFX effects + System), 16M Data ROM or Flash, 2*128Mbit Wave ROM, 2*4M DRAM (XP effects), 256k SRAM (framebuffer)</td> +<td>64KB System ROM, 8M System Flash, 256K SRAM (USB controller), 2*4M +DRAM (EFX effects + System), 16M Data ROM or Flash, 2*128Mbit Wave ROM, +2*4M DRAM (XP effects), 256k SRAM (framebuffer)</td> <td style="text-align: center;">64</td> <td style="text-align: center;">128</td> </tr> @@ -566,7 +939,9 @@ Boot:5170[5170]1.01</code></pre> <td style="text-align: center;">SC-8820</td> <td style="text-align: center;">RA09-002 (Custom) ‘XP6’</td> <td style="text-align: center;"><a href="https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7010/sh7014.html">SH7017</a></td> -<td>64KB System ROM, 256K SRAM (USB controller), 16M Data ROM or Flash, 2*4M DRAM (EFX effects + System), 128Mbit+164Mbit Wave Rom, 4M DRAM (XP effects)</td> +<td>64KB System ROM, 256K SRAM (USB controller), 16M Data ROM or Flash, +2*4M DRAM (EFX effects + System), 128Mbit+164Mbit Wave Rom, 4M DRAM (XP +effects)</td> <td style="text-align: center;">32</td> <td style="text-align: center;">64</td> </tr> @@ -574,7 +949,8 @@ Boot:5170[5170]1.01</code></pre> <td style="text-align: center;">JV-1080</td> <td style="text-align: center;">MBCS30109B (XP Chip) ‘XP’</td> <td style="text-align: center;"><a href="https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7030/sh7032.html">SH7034</a></td> -<td>CPU has 64KB Program Flash + 4KB SRAM built-in, 512kbit SRAM, 1Mbit DRAM, 8Mbit Data ROM, 2*1M DRAM (XP effects), 4*Wave ROM</td> +<td>CPU has 64KB Program Flash + 4KB SRAM built-in, 512kbit SRAM, 1Mbit +DRAM, 8Mbit Data ROM, 2*1M DRAM (XP effects), 4*Wave ROM</td> <td style="text-align: center;">16</td> <td style="text-align: center;">64</td> </tr> @@ -582,7 +958,8 @@ Boot:5170[5170]1.01</code></pre> <td style="text-align: center;">JV-2080</td> <td style="text-align: center;">TC170C200AF-005 (TG) ‘XP’</td> <td style="text-align: center;"><a href="https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7030/sh7032.html">SH7034</a></td> -<td>CPU has 64KB Program Flash + 4KB SRAM built-in, 2*DRAM, DRAM (XP effects), DRAM (LCD framebuffer), DRAM, SRAM, ROM or Flash</td> +<td>CPU has 64KB Program Flash + 4KB SRAM built-in, 2*DRAM, DRAM (XP +effects), DRAM (LCD framebuffer), DRAM, SRAM, ROM or Flash</td> <td style="text-align: center;">16</td> <td style="text-align: center;">64</td> </tr> @@ -590,7 +967,8 @@ Boot:5170[5170]1.01</code></pre> <td style="text-align: center;">XV-5080</td> <td style="text-align: center;">2*TC223C660CF-503 (RA08-503) ‘XV’</td> <td style="text-align: center;"><a href="https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7040/sh7040.html">SH7042</a></td> -<td>2*1Mbit SRAM, 256kbit (LCD framebuffer), 2*16Mbit (DRAM), 16Mbit Flash, 2*16Mbit DRAM (XV effects), 2*128Mbit Wave ROM</td> +<td>2*1Mbit SRAM, 256kbit (LCD framebuffer), 2*16Mbit (DRAM), 16Mbit +Flash, 2*16Mbit DRAM (XV effects), 2*128Mbit Wave ROM</td> <td style="text-align: center;">32</td> <td style="text-align: center;">128</td> </tr> @@ -598,15 +976,19 @@ Boot:5170[5170]1.01</code></pre> <td style="text-align: center;">XV-5050</td> <td style="text-align: center;">TC223C660CF-503 (RA08-503) ‘XV’</td> <td style="text-align: center;"><a href="https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7010/sh7014.html">SH7016</a></td> -<td>8Kbit EEPROM, 32Mbit Flash, 16Mbit DRAM, 16Mbit DRAM (XV effects), 2*128Mbit Wave ROM</td> +<td>8Kbit EEPROM, 32Mbit Flash, 16Mbit DRAM, 16Mbit DRAM (XV effects), +2*128Mbit Wave ROM</td> <td style="text-align: center;">16</td> <td style="text-align: center;">64</td> </tr> <tr class="even"> <td style="text-align: center;">MC-909</td> <td style="text-align: center;">TC223C660CF-503 (RA08-503) ‘XV’</td> -<td style="text-align: center;"><a href="https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7700/sh7706.html">SH7706</a> @ 128MHz</td> -<td>2*64Mbit SDRAM (system), 16Mbit Flash (program), 256Mbit Flash (program, user), 16Mbit DRAM (external effects RAM), 4Mbit DRAM (XV effects), 2*64Mbit Wave SDRAM, 128Mbit Wave ROM</td> +<td style="text-align: center;"><a href="https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7700/sh7706.html">SH7706</a> +@ 128MHz</td> +<td>2*64Mbit SDRAM (system), 16Mbit Flash (program), 256Mbit Flash +(program, user), 16Mbit DRAM (external effects RAM), 4Mbit DRAM (XV +effects), 2*64Mbit Wave SDRAM, 128Mbit Wave ROM</td> <td style="text-align: center;">16</td> <td style="text-align: center;">64</td> </tr> @@ -623,7 +1005,8 @@ Boot:5170[5170]1.01</code></pre> </div> <h3 id="tocanch19" class="tvis">Chart B</h3> <div class="collapse" data-caption="List of integrated circuit chips on SD-80 main board"> -<p>Follow the link in the first column for a board photo with that chip visible. Sorry for the shaky photo and poor depth of field.</p> +<p>Follow the link in the first column for a board photo with that chip +visible. Sorry for the shaky photo and poor depth of field.</p> <table> <tbody><tr> <th> @@ -649,7 +1032,8 @@ IC 1 </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC2.jpg">IC 2</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC2.jpg">IC +2</a> </td> <td> 6417706 SH3 BC13008 133 0413 @@ -660,7 +1044,8 @@ IC 1 </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC3.jpg">IC 3</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC3.jpg">IC +3</a> </td> <td> LH28F 160BJE-BTL80 SHARP JAPAN 0428 7xN @@ -671,7 +1056,8 @@ Flash Memory (16Mbit) </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC4.jpg">IC 4, 6</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC4.jpg">IC 4, +6</a> </td> <td> SANYO LC381616IET-70 KZA7G0CD1 0042 @@ -682,7 +1068,8 @@ SDRAM (16Mbit) </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC2.jpg">IC 5</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC2.jpg">IC +5</a> </td> <td> ‘H5’ or ‘115’ (illegible) @@ -704,7 +1091,8 @@ NAND Gate </tr> <tr> <td> -IC <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC2.jpg">8</a>, <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC27.jpg">20, 22~25</a> +IC <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC2.jpg">8</a>, <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC27.jpg">20, +22~25</a> </td> <td> 4C1Y LV 245A @@ -726,7 +1114,8 @@ F P42AB VT245A </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC27.jpg">IC 10, 12</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC27.jpg">IC +10, 12</a> </td> <td> 0431H LVXC3245 @@ -759,7 +1148,8 @@ IC 14 </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_datecode.jpg">IC 15</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_datecode.jpg">IC +15</a> </td> <td> 4D36 LV 04A @@ -770,7 +1160,8 @@ Hex Inverter </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_audio.jpg">IC 16</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_audio.jpg">IC +16</a> </td> <td> 4D16 LV 14A @@ -781,7 +1172,8 @@ Hex Schmitt-Trigger Inverter </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC17.jpg">IC 17</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC17.jpg">IC +17</a> </td> <td> Roland R02902867 137 352B100 @@ -803,7 +1195,8 @@ Dual 2/4 Decoder </tr> <tr> <td> -IC <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC19.jpg">19</a>, <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC27.jpg">27</a> +IC <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC19.jpg">19</a>, +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC27.jpg">27</a> </td> <td> Roland R01455956 RA08-503 JAPAN 0330EAI F0032ZAC @@ -825,7 +1218,8 @@ Inverter (CMOS) </tr> <tr> <td> -IC <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC26.jpg">26</a>, <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC29.jpg">30</a> +IC <a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC26.jpg">26</a>, +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC29.jpg">30</a> </td> <td> HYUNDAI GM71C18163CJ6 0040 AG1 KOREA @@ -836,7 +1230,8 @@ EDO DRAM (16Mbit) </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC28.jpg">IC 28</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC28.jpg">IC +28</a> </td> <td> Roland R02678601 23C128L-529J 0224E7007 @@ -847,7 +1242,8 @@ Wave ROM (128Mbit?) <a id="n16" href="#note16" class="note">[16]</a> </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC29.jpg">IC 29</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_IC29.jpg">IC +29</a> </td> <td> Roland R02678612 23C128L-535K 0222E7005 @@ -858,7 +1254,8 @@ Wave ROM (128Mbit?) </tr> <tr> <td> -IC <a href="https://filestorage.chrisoft.org/blog/img/SD-80_audio.jpg">31</a>, 35 +IC <a href="https://filestorage.chrisoft.org/blog/img/SD-80_audio.jpg">31</a>, +35 </td> <td> 4570 431 @@ -869,7 +1266,8 @@ Regulator </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_audio.jpg">IC 32, 34</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_audio.jpg">IC +32, 34</a> </td> <td> PCM1716E 27ZDHFM @@ -880,7 +1278,8 @@ DAC </tr> <tr> <td> -<a href="https://filestorage.chrisoft.org/blog/img/SD-80_audio.jpg">IC 33</a> +<a href="https://filestorage.chrisoft.org/blog/img/SD-80_audio.jpg">IC +33</a> </td> <td> 04 16H TC9271FS @@ -903,35 +1302,143 @@ A E </tbody></table> </div> <h2 id="tocanch20" class="tvis">Verdict</h2> -<p>The SD-80, a product in Roland’s more budget-friendly Sound Canvas (Studio Canvas) line up, is a great sound module mainly focused at standards compliance at its time. In my opinion it’s the direct successor of the SC-8850, while the SD-90 is the direct successor of the SC-D70 (both are audio interfaces with a sound module integrated).</p> -<p>The Studio Canvas family is Roland’s first and last line up of sound modules that map nearly all instruments to the GM2 instrument map. While making the instrument mapping less confusing, this instrument mapping has its limitations. No later Roland sound module does the same thing.</p> -<p>Hardware wise, the SD-80 is extremely close to the XV-5080. But the SD-80 being a ‘Rompler’, its hardware capability is severely limited by Roland by matching them with worse wave ROM contents than its professional counterpart. This seems to be true across almost all professional and budget-friendly Roland synths in the 90s. (SC-88 has the same tone generator as JP-1080 (‘XP’), SC-88Pro has the same tone generator as JP-2080 (‘XP3’). SC-8850 and SC-8820 use a newer revision of the ‘XP’ chip (‘XP6’), which seems to be unused in a professional product.)</p> -<p>Roland no longer makes ‘romplers’ today. Due to their unique sounds, these canvases might become a collector’s item in the future.</p> -<h2 id="tocanch21" class="tvis">Things to do besides imitating ZUN</h2> -<p>The SD-80 does not like QMidiPlayer very much. So the first thing to do is quite clear.</p> -<p>Giving it a total makeup is the second thing on my bucket list. I’ll probably ditch the original top cover and front panel altogether and make some custom acrylic glass parts for it.</p> -<p>Porting Linux to it might be a very fun (also atrocious) thing to do. The internals of the SD-80 is capable of doing much more than what it does as a STUDIO Canvas. It’s got the same main processor as the MC-909, just think about the possibility out there (this is also the reason why I call it a ‘trapped beast’ in the title of this post). The only thing against this is that I am shy of any experience with this level of hardware hacking.</p> -<p>Setting up a web service where people upload their midi files and have them rendered with the SD-80 also sounds pretty cool. But I’m afraid I’ll receive something from Roland by then and it wouldn’t be fine for me. Is it really illegal to use a instrument on a time-sharing basis?</p> -<p>Seriously though if I could pull it off, I’ll probably add a donation button and buy more classic sound modules for the site. Eventually it will turn into an online museum for sound modules… screw it I’m talking utter nonsense again.</p> -<p>Also somehow extracting the waveforms and creating a instrument bank for HALion or Kontact is tempting. But the odds of being sued by Roland is even higher even though they did not explicitly disallow sampling their early products. To be honest I found it disturbing about the sampling restriction on these ‘unconventional’ instruments.</p> +<p>The SD-80, a product in Roland’s more budget-friendly Sound Canvas +(Studio Canvas) line up, is a great sound module mainly focused at +standards compliance at its time. In my opinion it’s the direct +successor of the SC-8850, while the SD-90 is the direct successor of the +SC-D70 (both are audio interfaces with a sound module integrated).</p> +<p>The Studio Canvas family is Roland’s first and last line up of sound +modules that map nearly all instruments to the GM2 instrument map. While +making the instrument mapping less confusing, this instrument mapping +has its limitations. No later Roland sound module does the same +thing.</p> +<p>Hardware wise, the SD-80 is extremely close to the XV-5080. But the +SD-80 being a ‘Rompler’, its hardware capability is severely limited by +Roland by matching them with worse wave ROM contents than its +professional counterpart. This seems to be true across almost all +professional and budget-friendly Roland synths in the 90s. (SC-88 has +the same tone generator as JP-1080 (‘XP’), SC-88Pro has the same tone +generator as JP-2080 (‘XP3’). SC-8850 and SC-8820 use a newer revision +of the ‘XP’ chip (‘XP6’), which seems to be unused in a professional +product.)</p> +<p>Roland no longer makes ‘romplers’ today. Due to their unique sounds, +these canvases might become a collector’s item in the future.</p> +<h2 id="tocanch21" class="tvis">Things to do besides +imitating ZUN</h2> +<p>The SD-80 does not like QMidiPlayer very much. So the first thing to +do is quite clear.</p> +<p>Giving it a total makeup is the second thing on my bucket list. I’ll +probably ditch the original top cover and front panel altogether and +make some custom acrylic glass parts for it.</p> +<p>Porting Linux to it might be a very fun (also atrocious) thing to do. +The internals of the SD-80 is capable of doing much more than what it +does as a STUDIO Canvas. It’s got the same main processor as the MC-909, +just think about the possibility out there (this is also the reason why +I call it a ‘trapped beast’ in the title of this post). The only thing +against this is that I am shy of any experience with this level of +hardware hacking.</p> +<p>Setting up a web service where people upload their midi files and +have them rendered with the SD-80 also sounds pretty cool. But I’m +afraid I’ll receive something from Roland by then and it wouldn’t be +fine for me. Is it really illegal to use a instrument on a time-sharing +basis?</p> +<p>Seriously though if I could pull it off, I’ll probably add a donation +button and buy more classic sound modules for the site. Eventually it +will turn into an online museum for sound modules… screw it I’m talking +utter nonsense again.</p> +<p>Also somehow extracting the waveforms and creating a instrument bank +for HALion or Kontact is tempting. But the odds of being sued by Roland +is even higher even though they did not explicitly disallow sampling +their early products. To be honest I found it disturbing about the +sampling restriction on these ‘unconventional’ instruments.</p> <h2 id="tocanch22" class="tvis">Newer Roland sound modules?</h2> -<p>Newer Roland sound modules such as SonicCell and the latest INTEGRA-7 seems to maintain the compatibility with their original ‘XP’ synthesis engine to some extent – as they all support SRX expansion in a certain way. The synthesis engines are obviously improving over the years as Roland says the SRX expansion sounds built into INTEGRA-7 will sound a little different compared to earlier modules.</p> -<p>However, disappointment strikes as soon as I saw the ‘READ’ button on screenshots of the editor software for the INTEGRA-7. I felt Roland really need to make more use of the USB bandwidth: the presence of that button implies the editor software still can’t reflect the realtime status of the synthesizer. <a id="n17" href="#note17" class="note">[17]</a> This is a huge drawback of using a hardware synthesizer that Roland still fails to fix to this day.</p> -<p>Also, the INTEGRA-7 is super expensive for an amateur and Roland ended their budget <a id="n18" href="#note18" class="note">[18]</a> SOUND Canvas / STUDIO Canvas product line years ago. So no more Roland sound modules for me I guess.</p> +<p>Newer Roland sound modules such as SonicCell and the latest INTEGRA-7 +seems to maintain the compatibility with their original ‘XP’ synthesis +engine to some extent – as they all support SRX expansion in a certain +way. The synthesis engines are obviously improving over the years as +Roland says the SRX expansion sounds built into INTEGRA-7 will sound a +little different compared to earlier modules.</p> +<p>However, disappointment strikes as soon as I saw the ‘READ’ button on +screenshots of the editor software for the INTEGRA-7. I felt Roland +really need to make more use of the USB bandwidth: the presence of that +button implies the editor software still can’t reflect the realtime +status of the synthesizer. <a id="n17" href="#note17" class="note">[17]</a> This is a huge +drawback of using a hardware synthesizer that Roland still fails to fix +to this day.</p> +<p>Also, the INTEGRA-7 is super expensive for an amateur and Roland +ended their budget <a id="n18" href="#note18" class="note">[18]</a> SOUND Canvas / STUDIO Canvas product line years +ago. So no more Roland sound modules for me I guess.</p> <h2 id="tocanch23" class="tvis">Trivia</h2> <ul> -<li><p>A XML file in the SD-80 editor (Script/SD-80EditorScript.xml) contains patch list and wave list for all SRX expansion cards, confirming the fact that the editor is based on an editor for some other sound module with expansion slots.</p></li> -<li><p>There are two crystal oscillators on the main board of SD-80. X1 is a 24 MHz one and X2 is a 16.934 MHz one. Both are out of range of SH7706’s allowed external clock frequency (clock mode 0 has a input range of 25 MHz to 66.67 MHz, clock mode 1 has a input range 6.25 MHz to 16.67 MHz). MC-909, which has the same CPU as the SD-80, has a 16 MHz crystal as the CPU clock source and the CPU operates at 128 MHz. There’s also a 16.934 MHz crystal in the MC-909, which is tied to its tone generator (the same tone generator as the one inside SD-80, RA08-503 or ‘XV’). X2 in SD-80 is also very close to one of its tone generator chip. My blind guess is that the output from X1 in SD-80 goes through a frequency divider and the CPU operates at 96 MHz. XV-5050 also has a 16.934 MHz clock source tied to its XV chip. XV-5080 however doesn’t have a 16.935 MHz crystal directly tied to its XV chip, but rather a 11.2886 MHz one going through a 3:2 PLL producing a 16.9329 MHz clock.</p></li> +<li><p>A XML file in the SD-80 editor (Script/SD-80EditorScript.xml) +contains patch list and wave list for all SRX expansion cards, +confirming the fact that the editor is based on an editor for some other +sound module with expansion slots.</p></li> +<li><p>There are two crystal oscillators on the main board of SD-80. X1 +is a 24 MHz one and X2 is a 16.934 MHz one. Both are out of range of +SH7706’s allowed external clock frequency (clock mode 0 has a input +range of 25 MHz to 66.67 MHz, clock mode 1 has a input range 6.25 MHz to +16.67 MHz). MC-909, which has the same CPU as the SD-80, has a 16 MHz +crystal as the CPU clock source and the CPU operates at 128 MHz. There’s +also a 16.934 MHz crystal in the MC-909, which is tied to its tone +generator (the same tone generator as the one inside SD-80, RA08-503 or +‘XV’). X2 in SD-80 is also very close to one of its tone generator chip. +My blind guess is that the output from X1 in SD-80 goes through a +frequency divider and the CPU operates at 96 MHz. XV-5050 also has a +16.934 MHz clock source tied to its XV chip. XV-5080 however doesn’t +have a 16.935 MHz crystal directly tied to its XV chip, but rather a +11.2886 MHz one going through a 3:2 PLL producing a 16.9329 MHz +clock.</p></li> </ul> <h2 id="tocanch24" class="tvis">If you want to learn more …</h2> <ul> -<li><a href="http://www.gigadenza.co.uk/?page_id=5116&all=1">Gigadenza</a>, owns multiple sound modules, including the latest INTEGRA-7.</li> -<li><a href="https://twitter.com/Romantique_Tp">Romantique Tp</a>, a Touhou music addict that I came across on Steinberg user forum.</li> +<li><a href="http://www.gigadenza.co.uk/?page_id=5116&all=1">Gigadenza</a>, +owns multiple sound modules, including the latest INTEGRA-7.</li> +<li><a href="https://twitter.com/Romantique_Tp">Romantique Tp</a>, a +Touhou music addict that I came across on Steinberg user forum.</li> </ul> -If you spot a mistake or have anything you wish to share on this topic, please do not hesitate to drop me a message. +If you spot a mistake or have anything you wish to share on this topic, +please do not hesitate to drop me a message. </article> </div><br><hr> - <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: Pulseaudio sucks a lot less compared to the old days, it even switch automatically between built in Intel HD Audio and external USB audio device when it’s plugged in / unplugged.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: SD-90 doesn’t seem to have a non-zero modulation level according to its manual. Interesting.<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: You can find the waveform list of SD-90/80 and XV-5080 online and do the comparison yourself.<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: ‘Piano 1 st.’ in TTS-1 is actually ‘St.Piano 1’ from STUDIO Canvas’ ‘solo’ set. TTS-1 doesn’t have a ‘key scale panning’ (this is XG terminology, which means ‘wide’ in Roland’s wordbook) piano preset.<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: The drum set mapping of Super Quartet is not GM compatible. It comes with a couple of sounds the STUDIO Canvas lacks.<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: This is a reasonable guess, see chart B below for details.<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: The SD-90 do have <em>almost</em> the same level of editability as the SD-80, which can be achieved with the use of an updated version of SD-80’s editor, however it seems that SD-90 can’t save user patches. The SD-20, on the other hand, never enjoy the same level of editability. (The SD-20 is probably still editable by sending system exclusive messages directly?)<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: One on each stereo channel.<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: Vibrato uses a separate LFO, so technically it’s three.<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: NRPN message setting expression to 100% on one device may set filter resonance to 100% on another. Imagine that.<br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: I counted the instruments by turning the knob. The knob sometimes skips forward and backward, so there’s no way I count them accurately in a rush. I will probably make a complete patch list another day. UPDATE: the complete patch list could be found <a href="https://filestorage.chrisoft.org/blog/data/SD-80/SD80XGLiteInstList.ods">here</a> <br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: The problem found in QMidiPlayer can be solved by simply lowering buffer size. <br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: In case you haven’t yet noticed, there are two of those chips on the board.<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/cpu/sh3/clock-sh7706.c">https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/cpu/sh3/clock-sh7706.c</a> <br></span><span class="TText"><a id="note15" href="#n15">[15]</a>: Data for all models except the SD-80 are from their service notes.<br></span><span class="TText"><a id="note16" href="#n16">[16]</a>: The text on this chip together with the next one suspiciously resembles the part number of XV-5080’s wave ROM chips, plus the 128 Mbit wave ROM chips found in SC-8850 and SC-8820. (SC-8850 has 2*128Mbit wave ROM, while SC-8820 has 128Mbit + 64Mbit. The part number of the 64Mbit wave ROM chip has a completely different naming scheme.)<br></span><span class="TText"><a id="note17" href="#n17">[17]</a>: I did not do much research on this and I could be completely wrong on this topic.<br></span><span class="TText"><a id="note18" href="#n18">[18]</a>: compared to their JV/XV products.<br></span></div> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: Pulseaudio sucks a lot less compared to +the old days, it even switch automatically between built in Intel HD +Audio and external USB audio device when it’s plugged in / +unplugged.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: SD-90 doesn’t +seem to have a non-zero modulation level according to its manual. +Interesting.<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: You can find the waveform list of SD-90/80 and XV-5080 +online and do the comparison yourself.<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: ‘Piano 1 st.’ in TTS-1 is +actually ‘St.Piano 1’ from STUDIO Canvas’ ‘solo’ set. TTS-1 doesn’t have +a ‘key scale panning’ (this is XG terminology, which means ‘wide’ in +Roland’s wordbook) piano preset.<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: The drum set mapping of Super Quartet is not GM +compatible. It comes with a couple of sounds the STUDIO Canvas +lacks.<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: This is a reasonable +guess, see chart B below for details.<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: The +SD-90 do have <em>almost</em> the same level of editability as the +SD-80, which can be achieved with the use of an updated version of +SD-80’s editor, however it seems that SD-90 can’t save user patches. The +SD-20, on the other hand, never enjoy the same level of editability. +(The SD-20 is probably still editable by sending system exclusive +messages directly?)<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: One on each stereo channel.<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: Vibrato uses a separate LFO, so technically it’s +three.<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: NRPN message setting +expression to 100% on one device may set filter resonance to 100% on +another. Imagine that.<br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: I counted the instruments by turning the knob. +The knob sometimes skips forward and backward, so there’s no way I count +them accurately in a rush. I will probably make a complete patch list +another day. UPDATE: the complete patch list could be found +<a href="https://filestorage.chrisoft.org/blog/data/SD-80/SD80XGLiteInstList.ods">here</a> +<br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: The problem found in QMidiPlayer can be +solved by simply lowering buffer size. <br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: In case you haven’t yet noticed, +there are two of those chips on the board.<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/cpu/sh3/clock-sh7706.c">https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/sh/kernel/cpu/sh3/clock-sh7706.c</a> +<br></span><span class="TText"><a id="note15" href="#n15">[15]</a>: Data for all models except the SD-80 are from their service +notes.<br></span><span class="TText"><a id="note16" href="#n16">[16]</a>: The text on this chip together with the +next one suspiciously resembles the part number of XV-5080’s wave ROM +chips, plus the 128 Mbit wave ROM chips found in SC-8850 and SC-8820. +(SC-8850 has 2*128Mbit wave ROM, while SC-8820 has 128Mbit + 64Mbit. The +part number of the 64Mbit wave ROM chip has a completely different +naming scheme.)<br></span><span class="TText"><a id="note17" href="#n17">[17]</a>: I did not do much research on this +and I could be completely wrong on this topic.<br></span><span class="TText"><a id="note18" href="#n18">[18]</a>: compared to their JV/XV +products.<br></span></div> <div id="insanch" style="height:3em;"></div> <div id="footer" style=""> <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> diff --git a/blog/post/2019-06-24.html b/blog/post/2019-06-24.html new file mode 100644 index 0000000..2affd40 --- /dev/null +++ b/blog/post/2019-06-24.html @@ -0,0 +1,471 @@ +<!DOCTYPE html><html><head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<meta name="theme-color" content="#000000"> +<title>Chrisoft::Blog</title> +<script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> +<script type="text/javascript" src="/blog/footnoter.js"></script> +<script type="text/javascript" src="/blog/aes-js.js"></script> +<script type="text/javascript" src="/blog/scrypt.js"></script> +<script type="text/javascript" src="/blog/sha256.js"></script> +<script type="text/javascript" src="/blog/decryptor.js"></script> +<link rel="stylesheet" type="text/css" href="/common.css"> +<link rel="stylesheet" type="text/css" href="/panel.css"> +<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> +<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b"> +<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a"> +<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b"> +<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a"> +<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b"> +<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a"> +<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b"> +<link rel="stylesheet" type="text/css" href="/blog/blogext.css"> +<script> +function ol() +{ + window.onresize=function() + { + if(window.innerWidth<768) + setupevents(); + else unsetevents(); + } + window.onresize(); + loadTheme(); + _decryptonload(); +} +</script> +</head> +<body onload="ol()" style="overflow-x:hidden;"> + <div id="panel" class="TText"> + <ul id="panellist"> + <li><a href="/"><h1>Chrisoft</h1></a></li> + <li><a href="/blog"><h2>Blog</h2></a></li> + <li><a href="#"><h3 id="title">Working as an intern for "the spyware corporation"</h3></a></li> + <li><span>Tags</span> + <ul id="tagslist"> + <li><a href="/blog/list/garbage/">garbage</a></li><li><a href="/blog/list/sophistry/">sophistry</a></li></ul> + </li> + <li id="tocouter"> + <span>Table of Contents</span> + <ul id="tocroot"> + <li><a class="toctarg" href="#tocanch0">A few notes upfront…</a></li><li><a class="toctarg" href="#tocanch1">The Decision</a></li><li><a class="toctarg" href="#tocanch2">The Workplace, the +Colleagues and the Life</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch3">My work</a></li><li><a class="toctarg" href="#tocanch4">Payment</a></li><li><a class="toctarg" href="#tocanch5">Final Days & The days after</a></li></ul></li><li><a class="toctarg" href="#tocanch6">Shitty Code</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch7">pasteFilesV2 also deletes +file</a></li><li><a class="toctarg" href="#tocanch8">Practically no coding +conventions.</a></li></ul></li><li><a class="toctarg" href="#tocanch9">Weirdness, quirks and +other strange things</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch10">“Developers’ lives matter!”</a></li><li><a class="toctarg" href="#tocanch11">Incompetent coworkers +start to pop up</a></li><li><a class="toctarg" href="#tocanch12">“Designer-driven” development</a></li><li><a class="toctarg" href="#tocanch13">Code review, or “code +flattery”?</a></li><li><a class="toctarg" href="#tocanch14">Privacy issues?</a></li></ul></li><li><a class="toctarg" href="#tocanch15">Dick moves</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch16">… as taken literally</a></li><li><a class="toctarg" href="#tocanch17">Rushing V20</a></li><li><a class="toctarg" href="#tocanch18">Lacking / bad community +interaction</a></li><li><a class="toctarg" href="#tocanch19">Illegal business practice</a></li><li><a class="toctarg" href="#tocanch20">Restructure shenanigans</a></li><li><a class="toctarg" href="#tocanch21">Walking away from “the +founders’ spirits”</a></li></ul></li><li><a class="toctarg" href="#tocanch22">Epilogue</a></li></ul> + </li> + <li style="margin-left:-0.5em"><a id="prevp" href="2019-04-25.html">Prev post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="2019-09-04.html">Next post</a></li> + </ul> + </div> + <div id="content"> + <h2 id="titleh" class="TText" style="font-wight:normal;">Working as an intern for "the spyware corporation"</h2> + <div id="datetags" class="TText" style="margin-bottom:1em;">2019-06-24<br>#garbage #sophistry</div> + <hr><div id="article" class="TText"><article> +<h2 id="tocanch0" class="tvis">A few notes upfront…</h2> +<p>This post was supposed to come out as soon as it was finished. Well +it looks complete but for some reason I couldn’t remember, I never made +it public. Published 2024-02-17 without further modification.</p> +<p>Original post starts below.</p> +<p>If you are still unaware, the title is just sarcasm. As far as I +know, the division I was working for does not work on any spyware.</p> +<p>Also, this article is <strong>not</strong> approved by the propaganda +division whatsoever. Everything is straight up garbage.</p> +<h2 id="tocanch1" class="tvis">The Decision</h2> +<p>As I have made up my mind to ‘strategically’ delay my graduation by a +year, I initially hoped for taking the following months off and I did +not plan for my graduation thesis at all. Therefore I intentionally +skipped the subject selection process. All I wanted to do is chill for +half an year and maybe make some contributions to several free software +projects. Teachers noticed this and managed to persuade me to finish the +graduation thesis this year. Only at this time did I realize how stupid +I was – I am going to contribute to projects anyway, why don’t I take +the chance to finish my thesis?</p> +<p>However, as I have missed the opportunity to work on projects led by +professors in my college, I had to look for intern jobs elsewhere. As I +am not going to work for unethical companies, many companies my +classmates are rushing into are not feasible for me. But actually I +already have my choice in my mind: cause I am really interested in +spying on how the ‘spyware corporation’ works on a daily basis.</p> +<p>Finally, the choice was made. I tossed in my CV, which was put +together in 5 minutes to them. Before long I got a quick reply. With +everything settled down rather quickly, off I went.</p> +<p>To sum it up, it was because:</p> +<ul> +<li>I was curious.</li> +<li>I had plenty of time to waste.</li> +<li>I wanted to get away from the campus I already spent 3 years +in.</li> +<li>with the additional benefit of finishing my graduation project.</li> +</ul> +<h2 id="tocanch2" class="tvis">The Workplace, the +Colleagues and the Life</h2> +<p>The workplace is nothing fancy. Dimly lighted, the work area is +fairly cozy, possibly designed specially for us cavern-dwelling +programmers. Computing devices are scattered throughout the enormous +room, in which 90% of the local employees work.</p> +<p>Co-workers here are competent to say at least (until they started +rushing V20, as noted below). To list a few:</p> +<ul> +<li><a href="https://www.blumia.net/about.html">BLumia</a>: no more +elaboration needed.</li> +<li><a href="https://blog.justforlxz.com/about/">Kirigaya</a>: a little +bit mean, a little bit naughty, but still nice guy to chat with.</li> +<li><a href="https://github.com/zccrs">zccrs</a>: damn this guy +definitely knows what he is doing when reviewing my shitty code. Rumors +has it that he was once a wizard working for Nokia.</li> +<li><a href="https://hualet.org/">Hualet</a>: that one who interviewed +me. Passionate about free software. We talk quite a lot in private.</li> +</ul> +<p>Life quality in Wuhan was not a huge degradation compared to that of +my university times, I’d put it that way. Commute times weren’t super +long, foods here are nice (at least it rids me of the same kind of foods +I had to have everyday on the campus), also I could for the first time +cook for myself.</p> +<p>Stereotype of the climate in southern China was broken: your clothes +<strong>will</strong> be able to dry within a day, and you couldn’t +really squeeze water out of the air.</p> +<p>Public transit in Wuhan was tolerable until you got out of reach of +the metro: the bus service was <strong>horrendous</strong>. There was no +indication of where the actual station was, and the bus stops randomly +‘roughly around’. I tried it once and dreaded having to take a bus ever +since (fortunately, I didn’t).</p> +<p>I lived in a rental room provided by Ziroom, which is essentially an +apartment rental service broker. The apartment was shared by 5 persons, +from which formed 2 couples, and … you guessed it, me. The room was +relatively small (around 14m<sup>2</sup> in area), but super snug +compared to my dorm in university. The real reason I find it that way, +however, could ultimately be the fact that I was the only one inside and +could do what ever I want.</p> +<p>Interactions with roommates were minimal. In fact, I intentionally +avoid interactions with my roommates because I was that type of a +person.</p> +<p>By the way, cooking is really deep a rabbit hole and I’m just getting +down into it.</p> +<p>All in all, it was a freshing experience for ‘an extremely spoiled +child’ (as all my family members told me). I had fun, and I came back +with every body part intact. I’m content with it.</p> +<h3 id="tocanch3" class="tvis">My work</h3> +<p>I mainly worked on the following things:</p> +<ul> +<li>Adding basic optical disc authoring functionality to the file +manager.</li> +<li>Move network configuration in the control center to the new code +base.</li> +<li>Giving the computer view in the file manager its new look.</li> +<li>Random bug fixes in the file manager.</li> +<li>A small portion of utility classes in DTK.</li> +</ul> +<p>There’s a lot of other miscellaneous stuff I did, some of which +involves seizure-inducing programming languages +<a id="n1" href="#note1" class="note">[1]</a>. I’m not going to list those things here.</p> +<p>Actually, I promised to help revamping the infrastructure when I +entered Deepin, mainly to improve its transparency (like Debian). +However…</p> +<ul> +<li>They didn’t care.</li> +<li>I wasn’t given time to do anything about it.</li> +<li>I barely learned enough about how the current infrastructure +works.</li> +</ul> +<p>And the promise was thrown straight out of the window.</p> +<h3 id="tocanch4" class="tvis">Payment</h3> +<p>Now looking back, I guess I was basically free labor <a id="n2" href="#note2" class="note">[2]</a> , donating my time to Deepin. I +literately don’t care though, because I didn’t came for the money. It +could be cringe-inducing to say, but their payment actually exceeded my +initial expectation.</p> +<p>By the way I actually even saved up a couple thousand during my time +there. (Setting aside the fee ETS charged me for TOEFL and GRE of +course. Those are nothing but f*cking cash grabs.) Guess it’s due to my +extremely thrifty (stingy even) nature <a id="n3" href="#note3" class="note">[3]</a>.</p> +<h3 id="tocanch5" class="tvis">Final Days & The days after</h3> +<p>I made my final commit on November 15th, and ended my internship on +the same day.</p> +<p>I stayed in Wuhan for another 30 days intermittently, finishing my +final TOEFL test, visiting places, meeting with people, and most +frequently of all, chilling in my ‘secret bear den’ (which refers to my +rental room, obviously). Quite shockingly, I somehow managed to keep +basically the same sleep schedule as the one before my internship +ended.</p> +<p>I returned home on January 3rd, and I was as lucky as one can ever +be, cause all the coronavirus shenanigans just started to cook up.</p> +<h2 id="tocanch6" class="tvis">Shitty Code</h2> +<p>Never have I felt so involved with a programmer humor post until I +have to actually deal with an old code base.</p> +<h3 id="tocanch7" class="tvis">pasteFilesV2 also deletes +file</h3> +<p>When called with some obscene parameters, this function actually +delete a file. What the hell.</p> +<p>Even my code is arguably less shitty in this regard.</p> +<h3 id="tocanch8" class="tvis">Practically no coding +conventions.</h3> +<p>Mixing tabs and spaces. Different indentation conventions. +Incompatible naming schemes and even misspelled words in identifiers. +You name it.</p> +<p>In fact, deepin does have coding conventions, as listed <a href="https://hualet.org/blog/2019/07/23/deepin-qt/c-%E4%BB%A3%E7%A0%81%E9%A3%8E%E6%A0%BC%E6%8C%87%E5%8D%97/">here</a> +and <a href="https://hualet.org/blog/2019/07/30/deepin-%E5%BC%80%E5%8F%91%E8%80%85%E8%A7%84%E8%8C%83/">here</a>. +<a id="n4" href="#note4" class="note">[4]</a> +Unfortunately, they are actively broken everyday in most projects.</p> +<p>In defense of deepin though, this problem bothers a lot of other open +source projects as well. My limited experience working with KDE’s +codebase has already exposed that at least parts of KDE (namely +libksysguard) suffers from the same problem.</p> +<h2 id="tocanch9" class="tvis">Weirdness, quirks and +other strange things</h2> +<h3 id="tocanch10" class="tvis">“Developers’ lives matter!”</h3> +<p>C’mon. If you have to equip your developers with computers that have +inferior specs than your system requirements, don’t expect them to be +super productive.</p> +<p>Of course I understand they are currently under a rather tight +budget, but they are offering quad core Core i5 to testers and new +employees (some of which are quite incompetent, as described in the next +section).</p> +<p>Also, they refrain to provide necessary hardware for development. +When I was adding optical disc authoring functionality to the file +manager, my request to have a dedicated external optical drive was +denied for some bizarre reason, and I had to share two optical drives +with the testing department and the technical support department. This +significantly hindered the development of the said feature, until I +found a spare internal drive in the warehouse.</p> +<p>Sometimes my friends there joked about the dessert as promised by the +recruiter wasn’t being resupplied in time. For me, the dessert was +really a surplus – I just want a computer that takes less than half an +hour to build something!</p> +<h3 id="tocanch11" class="tvis">Incompetent coworkers +start to pop up</h3> +<p>At a certain point of time (around June), I noticed a significant +increase of personnel inside deepin. Many of these new employees are +improperly trained. They don’t know how to incorporate git into the work +flow (some know nothing about basic git concepts, or even about Linux at +all), don’t look up documentation when troubled (instead they turn to +CSDN <a id="n5" href="#note5" class="note">[5]</a> for help). As a result, the company had to spend +extra time teaching them basic stuff, which to me seems a real waste of +time.</p> +<p>These incompetent employees are a major source of pain for project +leaders. Some of them spent an entire day trying to figure out the cause +of a very simple bug, without any level of success. Fortunately for +deepin, most of them can reach some degree of competency after a few +weeks of work (although they are still sometimes seen typing git +commands from their notebooks).</p> +<h3 id="tocanch12" class="tvis">“Designer-driven” development</h3> +<p>This is a truly hilarious one. Here at Deepin (especially the project +I’m personally working on, the file manager), product manager doesn’t +decide what the program should be capable to do, the artistic designer +does. The artistic designer almost has sole dictation on the +specification of the product in this regard. We as developers can +certainly dispute, but cases in which the designers changed their minds +were rather rare, and most effort we made to persuade them was +futile.</p> +<p>By the way the current artistic designer is a very dedicated Apple +fanboy. Expect some very Apple-ish bullshit in the next release.</p> +<h3 id="tocanch13" class="tvis">Code review, or “code +flattery”?</h3> +<p>Code review is mandatory for every commit in Deepin. However policy +of code review varied from people to people. The only one that really +took it seriously was zccrs, who could almost always pick out the code +where I screwed up <a id="n6" href="#note6" class="note">[6]</a>.</p> +<p>On the other end of the spectrum was my friend, BLumia. His code +review was usually just going through my code once, and seldom demand +changes. At first I thought he was just giving me free passes, until I +noticed obvious mistakes made by other coworkers that somehow slipped +through code review. <a id="n7" href="#note7" class="note">[7]</a></p> +<h3 id="tocanch14" class="tvis">Privacy issues?</h3> +<p>I didn’t get to work on anything that actively connects to the +Internet. So my position basically stayed the same as stated in my last +article. To reiterate:</p> +<ul> +<li>They did a poor job dealing with public relationship.</li> +<li>Telemetry should be off by default, or the user should be prompted +whether they want it on installation.</li> +<li>It’s free software though! You can check the code and strip +everything unwanted.</li> +</ul> +<p>However, it’s probably getting even worse for Deepin (the +distribution) users. I was told that an identifier of the user’s +computer along with its specification might be used in the future. If +you want to keep using DDE, but you still value your privacy, maybe +consider moving to another distribution and install DDE there +<a id="n8" href="#note8" class="note">[8]</a>.</p> +<h2 id="tocanch15" class="tvis">Dick moves</h2> +<h3 id="tocanch16" class="tvis">… as taken literally</h3> +<p>As the amount of employees increases, space originally designated for +everything else was re-purposed into work area. We had to move around +while still working. Things were not looking good.</p> +<p>Finally at the end of September, the company moved. This is regarded +as the reaction to their increasing demand of workforces (as the old +place has become very jam packed due to the sky rocketing number of +staff), but it was also a very under-prepared dick move. Formal +announcement of the move wasn’t published until the very last day. The +new place is in the middle of nowhere and barely furnished. There are +also two more completely empty floors, which are the source of later +pains.</p> +<p>The new place is much farther away, taking almost an hour by metro, +or 40 minutes by commute shuttles. This forces me to get up a lot +earlier, which is very disturbing. My overall life quality had +definitely taken a punch after that.</p> +<p>The place is actually bought from Huawei, who left a complete mess +behind when they withdrew themselves from the place. Soon after we moved +in, drilling and hammering sounds could be heard up stairs left and +right. It was actually very nerve wrecking.</p> +<p>As the company hasn’t yet settled down completely, many promised +treatments are thrown out of the window. These include: desserts served +during work hours (which are actually served as usual, but the amount +didn’t increase as the number of employee rises. As a result, it’s +basically gone.), monthly birthday celebration for employees, showering +facilities, etc.</p> +<p>This dick move made some of the coworkers staring to reconsider their +life choices seriously.</p> +<h3 id="tocanch17" class="tvis">Rushing V20</h3> +<p>V20 is going to be the next major release of Deepin. Initially the +planning for this release was rather relaxed: this major overhaul was +projected to take about a year to mature, during which another one or +two maintenance releases of the current Deepin 15 were planned. However, +for some reason unknown to us <a id="n9" href="#note9" class="note">[9]</a>, the deadline was pushed back by a huge margin: now it’s +expected to be released somewhere between Q4 2019 and Q1 2020.</p> +<p>Now, suddenly the rapid increase of personnel makes sense. But I have +to question the quality of the resulting software – and it’s not looking +too good for them either. Many of the new applications suffer from major +performance deficiency: one of the development snapshots of Deepin +picture viewer takes more than two minutes to startup, and completely +blacks out if the window is resized, the new archive manager can cause +major lags on the file manager. Hell, even my own creation, the new +computer view for Deepin file manager, suffers from some performance +issues while resizing. But I simply didn’t have the time to address it +completely.</p> +<p>Wheels have been reinvented during the sprint, lots of them. In fact, +it seems to be one of their goals to out-source no applications from +other desktop environments. They even created a browser (based on the +Chromium code base, of course) with the help from Qihoo 360 and an IME +with the help from Sougou. I could give Deepin credit for the effort, +but the quality of these wheels are questionable at best.</p> +<h3 id="tocanch18" class="tvis">Lacking / bad community +interaction</h3> +<p>This is more or less the same thing as what I have already wrote in +‘The “Deepin is spyware” problem’. But now that I have more insight, I +could write more on this topic.</p> +<p>Deepin is a for-profit company, feature requests from commercial +customers always take priority. As the number of employees barely meets +the need to develop those features, requests from the community are +usually ignored straight away. Such filtering happens before the +developers could see the feature requests – we won’t know about them +unless we browse the support forum ourselves.</p> +<p>The ‘designer-central’ process is very problematic too. In my +opinion, Deepin’s chief designer is extremely self-centric, narcissistic +even. This resulted in some very serious uproar in the community such as +this one: +https://github.com/linuxdeepin/developer-center/issues/1210#issuecomment-496341368 +Sometimes even the developers couldn’t put up with these design choices, +and added hidden options for switching to something more sensible.</p> +<h3 id="tocanch19" class="tvis">Illegal business practice</h3> +<p>Namely, deepin-wine breaking GNU LGPL.</p> +<p>Deepin has been distributing a fork of an outdated branch of wine +without releasing the source code for quite some time, which is a very +explicit disregard to wine’s license.</p> +<p>They have promised to release the source code, but has yet to do so. +In the mean time, wine has made three stable releases. So far they have +only came up with a single justification: the fear of their domestic +commercial competitors <a id="n10" href="#note10" class="note">[10]</a>‘stealing’ their hard work. If +this bullshit stands for even a second, everybody on this planet would +have been a drug dealer ’cause laws don’t do shit.</p> +<p>To be frank, we have dozens of (L)GPL breakers here in China and we +never stop producing even more of them. We have Allwinner and XiaoMi, to +name a few. FFmpeg’s original hall of shame page would give you a even +longer list, and you will find the names of some gargantuan Chinese tech +companies in it.</p> +<p>I don’t even think Deepin’s international acceptance has anything to +do with its commercial success (or lack thereof). Do they even have any +overseas commercial customers? If Deepin has really been a commercial +success, I probably wouldn’t have to develop with a computer equipped a +shitty Pentium that otherwise would find its home in the dumpster.</p> +<h3 id="tocanch20" class="tvis">Restructure shenanigans</h3> +<h3 id="tocanch21" class="tvis">Walking away from “the +founders’ spirits”</h3> +<p>This is definitely, definitely a huge misstep and a real deal +breaker.</p> +<p>IMO Deepin was once among the best meritocracy free software +community in China. However with the changes applying to their roadmap +since v20, everything started to disintegrate.</p> +<p>Barriers were deliberately added to the community contribution +process (the repositories on GitHub are now merely synced with internal +repositories). Writing documentation was considered slacking (happened +to me a couple of times), making the already terrible documentation +situation even worse. They basically stopped even trying to make the +development process transparent to the public.</p> +<p>User’s freedom was thrown out of the window. Community edition now +requires logging into an online account to enable root access, which is +basically the first step to a complete vendor lock down. I imagine many +users would resort to other distros and install DDE instead (if they +still fancy using DDE in its new look and feel).</p> +<p>Don’t get me wrong. DDE was (and still is) a beautiful desktop +environment (even only superficially as some people might thought). It +has followers who will use it no matter what. However, it demands a +fork. A fork with its founders’ spirits in mind.</p> +<h2 id="tocanch22" class="tvis">Epilogue</h2> +<p>I’ve actually tried out the current public beta of Deepin V20 as of +writing this section, and the majority of the issues I mentioned above +still hold up. Grave performance degradation seems a lot less common +though, although my shitty-performing computer view code has barely been +touched since I left. A lot of applications are still in dare need of +polishing. They’d better keep those commits flowin’.</p> +<p>At this point of time I don’t even know what I was rambling about. It +was 1:40 in the morning. Did I just typed over 15000 characters only to +diss Deepin? Nope. Dwelling on our past success never makes us progress. +It’s the reflection upon the mistakes we made that does.</p> +<p>https://www.zhihu.com/question/344339517/answer/817025546</p> +</article> +<!-- +vim: tw=0 syntax=markdown spell spelllang=en_us +--> +</div><br><hr> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: vala?<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: and +definitely not a shitty one that only does repetitive work! In fact +while I was once chatting with Hualet, he told me I was probably among +the best interns ever here.<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: cough cough, RTX 2080, +cough cough.<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: These were formerly available on a documentation website on +one of deepin’s domains, but were somehow taken down later.<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: CSDN is a blogging platform and a forum for Chinese +developers. We don’t have stackoverflow or a clone of it here in China, +so CSDN became the savior of many Chinese programmers. Unfortunately +most of the user base of CSDN are equally bad as these new +employees.<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: His code reviews were sometimes even to a +degree of nitpicking, but I’m not really complaining since my code is +shit.<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: To BLumia: if you are reading this, I’m +not trying to be harsh here. It’s just a small reminder that you should +probably pay more attention to code review (if you’re still doing +it).<br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: A lot of this stuff is specific to Deepin (the distribution), +so you can get rid of most (but not all) of them by doing +so.<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: everyone has their own +speculations, of course. Mine is that they wish to hand out a surprising +present to their users, which I don’t feel super positive +for.<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: Please, don’t mention the ones backed +by the government (or in other words, ‘GuanXi’). They are not an excuse +for breaking laws or licenses.<br></span></div> + <div id="insanch" style="height:3em;"></div> + <div id="footer" style=""> + <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> + <div style="text-align:center;" class="TText"> + Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5 + <br> + Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span> + </div> + </div> + <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;"> + </div> + </div> + <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;"> + <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);"> + <div id="keyhint" style="margin-bottom:8px;"></div> + <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div> + <div style="height:2.25em;"> + <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button> + <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button> + </div> + + </div> + + +</div></body></html>
\ No newline at end of file diff --git a/blog/post/2019-09-04.html b/blog/post/2019-09-04.html index 5d1ee95..bdf607b 100644 --- a/blog/post/2019-09-04.html +++ b/blog/post/2019-09-04.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -84,29 +52,46 @@ loadTheme(); <li><a class="toctarg" href="#tocanch0">The Privacy Update</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch1">Getting rid of recaptcha</a></li><li><a class="toctarg" href="#tocanch2">The “Privacy Policy”</a></li><li><a class="toctarg" href="#tocanch3">And … that’s all?</a></li></ul></li></ul> </li> <li style="margin-left:-0.5em"><a id="prevp" href="2019-04-25.html">Prev post</a></li> - <li style="margin-left:-0.5em"><a id="nextp" href="2020-04-11.html">Next post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="2020-11-20.html">Next post</a></li> </ul> </div> <div id="content"> <h2 id="titleh" class="TText" style="font-wight:normal;">September 2019 Site Update</h2> <div id="datetags" class="TText" style="margin-bottom:1em;">2019-09-04<br>#web</div> <hr><div id="article" class="TText"><article> -<p>It’s been a while since the last site update. It’s time for one now.</p> +<p>It’s been a while since the last site update. It’s time for one +now.</p> <h2 id="tocanch0" class="tvis">The Privacy Update</h2> -<p><a href="https://cgit.chrisoft.org/web.git/commit/?id=3778fbfebf1cecda4036cd2a50e3b8239c80f1eb">The commit</a></p> -<p>This is <strong>not</strong> a visually significant update. Aside from some wording changes and new links, there’s nothing much more to it. The most important stuff is (again) all under the hood.</p> +<p><a href="https://cgit.chrisoft.org/web.git/commit/?id=3778fbfebf1cecda4036cd2a50e3b8239c80f1eb">The +commit</a></p> +<p>This is <strong>not</strong> a visually significant update. Aside +from some wording changes and new links, there’s nothing much more to +it. The most important stuff is (again) all under the hood.</p> <h3 id="tocanch1" class="tvis">Getting rid of recaptcha</h3> -<p>In the February site update, I upgraded the site from recaptcha 2 to recaptcha 3. Now it’s time to remove it.</p> -<p>As a privacy update, the task of the highest priority is to free users of this site from lengthy and obscure privacy terms (also non-free scripts) made by monopolistic tech giants like Google. And I was actually planning to do so for quite some time. It finally happened.</p> -<p>I have now switched to a relatively relaxed backend-only check that only checks whether your public IP address is in a blacklist (abuseipdb.com).</p> +<p>In the February site update, I upgraded the site from recaptcha 2 to +recaptcha 3. Now it’s time to remove it.</p> +<p>As a privacy update, the task of the highest priority is to free +users of this site from lengthy and obscure privacy terms (also non-free +scripts) made by monopolistic tech giants like Google. And I was +actually planning to do so for quite some time. It finally happened.</p> +<p>I have now switched to a relatively relaxed backend-only check that +only checks whether your public IP address is in a blacklist +(abuseipdb.com).</p> <h3 id="tocanch2" class="tvis">The “Privacy Policy”</h3> <p>If you haven’t read it yet, read it <a href="https://chrisoft.org/blog/post/Privacy.html">here</a>.</p> -<p>This is not a very serious privacy policy, but rather just random rambling on privacy-related topics.</p> -<p>Anyway this fulfilled quite an important missing part of my website, be it good or not.</p> +<p>This is not a very serious privacy policy, but rather just random +rambling on privacy-related topics.</p> +<p>Anyway this fulfilled quite an important missing part of my website, +be it good or not.</p> <h3 id="tocanch3" class="tvis">And … that’s all?</h3> -<p>Um… there’s also a new ‘hosted by ConoHa’ banner on the main page to reflect the current state of this site. It leads to their ‘ConoHa mode’ index (as opposed to the plain main page without their virtual character). It’s not a sponsored link so I don’t earn anything if you click it.</p> +<p>Um… there’s also a new ‘hosted by ConoHa’ banner on the main page to +reflect the current state of this site. It leads to their ‘ConoHa mode’ +index (as opposed to the plain main page without their virtual +character). It’s not a sponsored link so I don’t earn anything if you +click it.</p> <p>Also also, I’ve got hold of a new domain name (<a href="https://pineapple.cat">pineapple.cat</a>. Check it out!</p> -<p>With that said, everything in this update should be covered now. Not a huge update is it?</p> +<p>With that said, everything in this update should be covered now. Not +a huge update is it?</p> </article> <!-- vim: tw=0 syntax=markdown spell spelllang=en_us diff --git a/blog/post/2020-11-20.html b/blog/post/2020-11-20.html index faa4729..15f5a3c 100644 --- a/blog/post/2020-11-20.html +++ b/blog/post/2020-11-20.html @@ -49,7 +49,20 @@ function ol() <li id="tocouter"> <span>Table of Contents</span> <ul id="tocroot"> - <li><a class="toctarg" href="#tocanch0">“Official” Service Manual</a></li><li><a class="toctarg" href="#tocanch1">USB-PD Mod</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">(Accidentally) Circuit bent SD-80</a></li></ul></li><li><a class="toctarg" href="#tocanch3">Recording Setup Update Part 1</a></li><li><a class="toctarg" href="#tocanch4">Recording Setup Update Part 2</a></li><li><a class="toctarg" href="#tocanch5">Recording Setup Update Part 3, 4, 5…</a></li><li><a class="toctarg" href="#tocanch6">Rompler Preservation</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch7">Emulation</a></li><li><a class="toctarg" href="#tocanch8">Sampling the Rompler</a></li><li><a class="toctarg" href="#tocanch9">Dumping and Deciphering</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch10">Extra rambling about the ROM chip</a></li></ul></li><li><a class="toctarg" href="#tocanch11">SD-20 MIDI File Converter</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch12">FrankenTTS-1</a></li><li><a class="toctarg" href="#tocanch13">Other observations</a></li><li><a class="toctarg" href="#tocanch14">So… is this it?</a></li></ul></li><li><a class="toctarg" href="#tocanch15">Roland Cloud</a></li></ul></li><li><a class="toctarg" href="#tocanch16">A History lesson from someone who barely knows anything about it</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch17">LA</a></li><li><a class="toctarg" href="#tocanch18">(Unnamed synth engine in U-110)</a></li><li><a class="toctarg" href="#tocanch19">EP</a></li><li><a class="toctarg" href="#tocanch20">GP</a></li><li><a class="toctarg" href="#tocanch21">XP</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch22">Original XP</a></li><li><a class="toctarg" href="#tocanch23">XP2</a></li><li><a class="toctarg" href="#tocanch24">XP3</a></li><li><a class="toctarg" href="#tocanch25">XP6</a></li><li><a class="toctarg" href="#tocanch26">XP7</a></li></ul></li><li><a class="toctarg" href="#tocanch27">XV</a></li><li><a class="toctarg" href="#tocanch28">WX</a></li><li><a class="toctarg" href="#tocanch29">Beyond WX</a></li></ul></li><li><a class="toctarg" href="#tocanch30">Role played by the CPU in sound generation</a></li><li><a class="toctarg" href="#tocanch31">Other Curious Stuff</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch32">SD-80 is an XV-5080 …</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch33">SD-80’s sound content</a></li></ul></li><li><a class="toctarg" href="#tocanch34">More on SD-80 vs SD-90 vs SD-20</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch35">What does a SD-90 have that SD-80 doesn’t?</a></li><li><a class="toctarg" href="#tocanch36">What does a SD-80 have that SD-90 doesn’t?</a></li><li><a class="toctarg" href="#tocanch37">What’s the SD-20 anyway?</a></li><li><a class="toctarg" href="#tocanch38">What role does MFX play?</a></li></ul></li><li><a class="toctarg" href="#tocanch39"><code>Light Load</code> vs <code>High Load</code></a></li><li><a class="toctarg" href="#tocanch40">Block Diagram</a></li><li><a class="toctarg" href="#tocanch41">Other weird and interesting stuff</a></li></ul></li><li><a class="toctarg" href="#tocanch42">Errata of the original post</a></li><li><a class="toctarg" href="#tocanch43">References</a></li></ul> + <li><a class="toctarg" href="#tocanch0">“Official” Service Manual</a></li><li><a class="toctarg" href="#tocanch1">USB-PD Mod</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch2">(Accidentally) Circuit bent +SD-80</a></li></ul></li><li><a class="toctarg" href="#tocanch3">Recording Setup Update Part +1</a></li><li><a class="toctarg" href="#tocanch4">Recording Setup Update Part +2</a></li><li><a class="toctarg" href="#tocanch5">Recording Setup Update Part +3, 4, 5…</a></li><li><a class="toctarg" href="#tocanch6">Rompler Preservation</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch7">Emulation</a></li><li><a class="toctarg" href="#tocanch8">Sampling the Rompler</a></li><li><a class="toctarg" href="#tocanch9">Dumping and Deciphering</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch10">Extra rambling about the ROM +chip</a></li></ul></li><li><a class="toctarg" href="#tocanch11">SD-20 MIDI File Converter</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch12">FrankenTTS-1</a></li><li><a class="toctarg" href="#tocanch13">Other observations</a></li><li><a class="toctarg" href="#tocanch14">So… is this it?</a></li></ul></li><li><a class="toctarg" href="#tocanch15">Roland Cloud</a></li></ul></li><li><a class="toctarg" href="#tocanch16">A +History lesson from someone who barely knows anything about it</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch17">LA</a></li><li><a class="toctarg" href="#tocanch18">(Unnamed synth engine in +U-110)</a></li><li><a class="toctarg" href="#tocanch19">EP</a></li><li><a class="toctarg" href="#tocanch20">GP</a></li><li><a class="toctarg" href="#tocanch21">XP</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch22">Original XP</a></li><li><a class="toctarg" href="#tocanch23">XP2</a></li><li><a class="toctarg" href="#tocanch24">XP3</a></li><li><a class="toctarg" href="#tocanch25">XP6</a></li><li><a class="toctarg" href="#tocanch26">XP7</a></li></ul></li><li><a class="toctarg" href="#tocanch27">XV</a></li><li><a class="toctarg" href="#tocanch28">WX</a></li><li><a class="toctarg" href="#tocanch29">Beyond WX</a></li></ul></li><li><a class="toctarg" href="#tocanch30">Role played by the +CPU in sound generation</a></li><li><a class="toctarg" href="#tocanch31">Other Curious Stuff</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch32">SD-80 is an XV-5080 …</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch33">SD-80’s sound content</a></li></ul></li><li><a class="toctarg" href="#tocanch34">More on SD-80 vs SD-90 vs +SD-20</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch35">What does a SD-90 have +that SD-80 doesn’t?</a></li><li><a class="toctarg" href="#tocanch36">What does a SD-80 have +that SD-90 doesn’t?</a></li><li><a class="toctarg" href="#tocanch37">What’s the SD-20 anyway?</a></li><li><a class="toctarg" href="#tocanch38">What role does MFX play?</a></li></ul></li><li><a class="toctarg" href="#tocanch39"><code>Light Load</code> vs +<code>High Load</code></a></li><li><a class="toctarg" href="#tocanch40">Block Diagram</a></li><li><a class="toctarg" href="#tocanch41">Other weird and interesting +stuff</a></li></ul></li><li><a class="toctarg" href="#tocanch42">Errata of the original post</a></li><li><a class="toctarg" href="#tocanch43">References</a></li></ul> </li> <li style="margin-left:-0.5em"><a id="prevp" href="2019-09-04.html">Prev post</a></li> <li style="margin-left:-0.5em"><a id="nextp" href="2021-06-03.html">Next post</a></li> @@ -119,17 +132,42 @@ for(let x of al) </script> <article> <p>This the follow up article of my first post on the SD-80. View it <a href="https://chrisoft.org/blog/post/2019-04-25.html">here</a>.</p> -<p>It’s been <del>one year and a half</del> <del style="text-decoration-style: double">two years</del> three years since I got my SD-80. A lot of stuff happened (including the great pandemic of COVID-19 and my escape from Wuhan). I’ve also discovered a lot more about the SD-80. Instead of updating the original post (which is already excessively long), I decided to start a new post instead.</p> -<p>The actual publish date of this post is 2022-06-30 <del>because I have crippling procrastination</del>.</p> +<p>It’s been <del>one year and a half</del> +<del style="text-decoration-style: double">two years</del> three years +since I got my SD-80. A lot of stuff happened (including the great +pandemic of COVID-19 and my escape from Wuhan). I’ve also discovered a +lot more about the SD-80. Instead of updating the original post (which +is already excessively long), I decided to start a new post instead.</p> +<p>The actual publish date of this post is 2022-06-30 <del>because I +have crippling procrastination</del>.</p> <p>My special thanks go to:</p> <ul> -<li>Kalas, who contacted me for my original SD-80 post, without whom half of this article wouldn’t even exist.</li> -<li>Discord user KR.Palto#7592, who also has a <a href="https://www.youtube.com/c/KRPalto47_th_MIDI">YouTube channel</a>, for providing plenty of useful information and PCB shots of various Roland synth modules.</li> +<li>Kalas, who contacted me for my original SD-80 post, without whom +half of this article wouldn’t even exist.</li> +<li>Discord user KR.Palto#7592, who also has a <a href="https://www.youtube.com/c/KRPalto47_th_MIDI">YouTube channel</a>, +for providing plenty of useful information and PCB shots of various +Roland synth modules.</li> </ul> -<p>I’ve been procrastinating the release of this post for too long (almost 2 years by now). For this reason, the information I had on these modules may have updated half-way through the writing of this post. Therefore this post may contain self-contradicting statements. I’ll try to clear up any confusing parts. Feel free to reach to me if you find any, or just for any thoughts you have on this post. I would encourage anyone reading this post to get in touch with me if you have anything to discuss or find a mistake in this post. Every message will be greatly apprecitated. You can find ways to contact me in the “about” section of the home page.</p> +<p>I’ve been procrastinating the release of this post for too long +(almost 2 years by now). For this reason, the information I had on these +modules may have updated half-way through the writing of this post. +Therefore this post may contain self-contradicting statements. I’ll try +to clear up any confusing parts. Feel free to reach to me if you find +any, or just for any thoughts you have on this post. I would encourage +anyone reading this post to get in touch with me if you have anything to +discuss or find a mistake in this post. Every message will be greatly +apprecitated. You can find ways to contact me in the “about” section of +the home page.</p> <h2 id="tocanch0" class="tvis">“Official” Service Manual</h2> -<p>The site where I got my other service manuals for Roland synths (none of which I really own) has been updated with a service manual for SD-80. I got one copy immediately once I knew about this (Special thanks go to Kalas for letting me know).</p> -<p>Most of the service manual goes as expected: the general format, most chips (I correctly identified all chips that has Roland marking on them somehow), the block diagram and testing mode. There’s really not that much information in this manual that is new to me. The schematics are extremely useful for modding and repairing though.</p> +<p>The site where I got my other service manuals for Roland synths (none +of which I really own) has been updated with a service manual for SD-80. +I got one copy immediately once I knew about this (Special thanks go to +Kalas for letting me know).</p> +<p>Most of the service manual goes as expected: the general format, most +chips (I correctly identified all chips that has Roland marking on them +somehow), the block diagram and testing mode. There’s really not that +much information in this manual that is new to me. The schematics are +extremely useful for modding and repairing though.</p> <div class="collapse" data-caption="Updated list of integrated circuit chips on SD-80 main board"> <table> <colgroup> @@ -161,7 +199,8 @@ for(let x of al) </tr> <tr class="odd"> <td style="text-align: center;">IC 3</td> -<td style="text-align: center;">LH28F 160BJE-BTL80 SHARP JAPAN 0428 7xN</td> +<td style="text-align: center;">LH28F 160BJE-BTL80 SHARP JAPAN 0428 +7xN</td> <td style="text-align: center;">LH28F 160BJE-BTL80</td> <td style="text-align: center;">16Mbit Flash Memory</td> </tr> @@ -229,7 +268,8 @@ for(let x of al) <td style="text-align: center;">IC 17</td> <td style="text-align: center;">Roland R02902867 137 352B100</td> <td style="text-align: center;">M37641M8-137FP</td> -<td style="text-align: center;">7641 8-bit microcontroller, MIDI/USB interface</td> +<td style="text-align: center;">7641 8-bit microcontroller, MIDI/USB +interface</td> </tr> <tr class="odd"> <td style="text-align: center;">IC 18</td> @@ -239,9 +279,11 @@ for(let x of al) </tr> <tr class="even"> <td style="text-align: center;">IC 19, IC 27</td> -<td style="text-align: center;">Roland R01455956 RA08-503 JAPAN 0330EAI F0032ZAC</td> +<td style="text-align: center;">Roland R01455956 RA08-503 JAPAN 0330EAI +F0032ZAC</td> <td style="text-align: center;">TC223C660CF-503</td> -<td style="text-align: center;">Tone Generator + Effects Processor with integrated LCD & Input Controller</td> +<td style="text-align: center;">Tone Generator + Effects Processor with +integrated LCD & Input Controller</td> </tr> <tr class="odd"> <td style="text-align: center;">IC 21</td> @@ -251,19 +293,23 @@ for(let x of al) </tr> <tr class="even"> <td style="text-align: center;">IC 26, IC 30</td> -<td style="text-align: center;">HYUNDAI GM71C18163CJ6 0040 AG1 KOREA</td> +<td style="text-align: center;">HYUNDAI GM71C18163CJ6 0040 AG1 +KOREA</td> <td style="text-align: center;">GM71C18163CJ-6</td> -<td style="text-align: center;">16Mbit EDO DRAM (XV RAM / Effects delay line)</td> +<td style="text-align: center;">16Mbit EDO DRAM (XV RAM / Effects delay +line)</td> </tr> <tr class="odd"> <td style="text-align: center;">IC 28</td> -<td style="text-align: center;">Roland R02678601 23C128L-529J 0224E7007</td> +<td style="text-align: center;">Roland R02678601 23C128L-529J +0224E7007</td> <td style="text-align: center;">UPD23C128040ALGY-***-MJH</td> <td style="text-align: center;">128Mbit Mask ROM (Wave ROM)</td> </tr> <tr class="even"> <td style="text-align: center;">IC 29</td> -<td style="text-align: center;">Roland R02678612 23C128L-535K 0222E7005</td> +<td style="text-align: center;">Roland R02678612 23C128L-535K +0222E7005</td> <td style="text-align: center;">UPD23C128040ALGY-***-MKH</td> <td style="text-align: center;">128Mbit Mask ROM (Wave ROM)</td> </tr> @@ -293,49 +339,136 @@ for(let x of al) </tr> </tbody> </table> -<p>The CPU is in clock mode 1 (MD2=MD1=0, MD0=1). Input clock is 12MHz from the 8-bit 7641 controller. Actual clock of the SH-3 CPU depends on the value of its FRQCR register. However, the only possible values of the internal clock speed is either 48MHz or 96MHz (refer to the datasheet of SH7706 for details) <a id="n1" href="#note1" class="note">[1]</a>. Either way, the CPU is downclocked by quite a large margin.</p> -<p>The tone generator RA08-503 “XV” is an ASIC manufactured by Toshiba on a 300nm process (type TC223C).</p> +<p>The CPU is in clock mode 1 (MD2=MD1=0, MD0=1). Input clock is 12MHz +from the 8-bit 7641 controller. Actual clock of the SH-3 CPU depends on +the value of its FRQCR register. However, the only possible values of +the internal clock speed is either 48MHz or 96MHz (refer to the +datasheet of SH7706 for details) <a id="n1" href="#note1" class="note">[1]</a>. Either way, the CPU is downclocked by quite a +large margin.</p> +<p>The tone generator RA08-503 “XV” is an ASIC manufactured by Toshiba +on a 300nm process (type TC223C).</p> </div> <h2 id="tocanch1" class="tvis">USB-PD Mod</h2> -<p>WARNING: I’m a computer scientist (in its loosest sense), not an electrical engineer. Do not take any part of this section as advice. If you fried your equipment (I did!!) following this as an instruction, don’t blame it on me.</p> -<p>The 220V to 110V converter brick I have to carry around has been bugging me since the very first day I got my SD-80. Because the unit only consumes around 10 watts of power, I’ve always been dreaming of alternative ways to power it. When I first cracked my module open, I measured the power rails going out from the power supply unit: there is a ±15V pair, plus a +5V rail.</p> -<p>My top candidate was a solution based around USB-PD. I’ve seen people modding their ThinkPads to charge through USB Type-C on r/ThinkPad, so I thought that module plus some DC-DC converter circuitry will do the job. I also had a fallback plan, which is basically to use any switching mode power supply that accepts universal voltage has two output rails (one positive and one negative), and stick some additional regulator circuitry to generate the 5V output.</p> -<p>The USB-PD trigger module is actually very easy to come by nowadays, especially for someone in China. While others struggles to find these weird stuff on ebay and aliexpress, we just source them straight from taobao (which is essentially aliexpress for domestic users). There are even ready-to-use multi-rail voltage converter modules out there (they are either based around LM337/LM317, or TPS543x). Finally I picked the (seemingly) most popular PD trigger module people use to mod laptops from YZXstudio, and an adjustable voltage converter module based around TPS5430. The pictures below are from their sellers.</p> +<p>WARNING: I’m a computer scientist (in its loosest sense), not an +electrical engineer. Do not take any part of this section as advice. If +you fried your equipment (I did!!) following this as an instruction, +don’t blame it on me.</p> +<p>The 220V to 110V converter brick I have to carry around has been +bugging me since the very first day I got my SD-80. Because the unit +only consumes around 10 watts of power, I’ve always been dreaming of +alternative ways to power it. When I first cracked my module open, I +measured the power rails going out from the power supply unit: there is +a ±15V pair, plus a +5V rail.</p> +<p>My top candidate was a solution based around USB-PD. I’ve seen people +modding their ThinkPads to charge through USB Type-C on r/ThinkPad, so I +thought that module plus some DC-DC converter circuitry will do the job. +I also had a fallback plan, which is basically to use any switching mode +power supply that accepts universal voltage has two output rails (one +positive and one negative), and stick some additional regulator +circuitry to generate the 5V output.</p> +<p>The USB-PD trigger module is actually very easy to come by nowadays, +especially for someone in China. While others struggles to find these +weird stuff on ebay and aliexpress, we just source them straight from +taobao (which is essentially aliexpress for domestic users). There are +even ready-to-use multi-rail voltage converter modules out there (they +are either based around LM337/LM317, or TPS543x). Finally I picked the +(seemingly) most popular PD trigger module people use to mod laptops +from YZXstudio, and an adjustable voltage converter module based around +TPS5430. The pictures below are from their sellers.</p> <table> <tbody><tr> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sdp2_pdtrigerboard.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sdp2_pdtrigerboard.jpg"></a> <br>USB-PD trigger board +<a href="//filestorage.chrisoft.org/blog/img/sdp2_pdtrigerboard.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sdp2_pdtrigerboard.jpg"></a> <br>USB-PD +trigger board </div> </td> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sdp2_vrm.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sdp2_vrm.jpg"></a> <br>Adjustable VRM Module +<a href="//filestorage.chrisoft.org/blog/img/sdp2_vrm.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sdp2_vrm.jpg"></a> <br>Adjustable VRM +Module </div> </td> </tr> </tbody></table> -<p>I also bought some basic tools for soldering (Chinese knock-off of Quick 936A, lead-based solder and solder wick – I was too dumb to remember purchasing any flux) to make sure I can do the modding in my dorm.</p> -<p>I waited a few days for all packages to arrive. After that I tested every component I need and they worked just fine. It’s time to pull the trigger. I started with desoldering the AC input socket. That went decently smoothly. My confidence started to build up and proceeded to desolder the original SMPS module, which is a rectangular daughter board that has quite a few pins soldered on both sides of the board. Things went horribly wrong (particularly because I didn’t have any flux and the original lead-free solder refused to flow or blend with my leaded solder) and I started ripping tracks off the base board. Finally I decided it was an impossible task for me to desolder it without completely destroying both boards, so I simply drilled the pins out of the board. While the base board wasn’t totally destroyed, it was pretty close. I soldered wires directly to the components on the base board (because tracks on the other end have been ripped off). At this time my soldering job was just totally awful because I was pissed and it was super late into the night. Anyway, when I finally piecing everything together, it somehow worked.</p> -<p>Next it was time to put everything back into place. I had the idea of designing a 3d-printed holder for the USB Type-C extension cable that fills the hole for the original AC socket, however I couldn’t even afford a proper 2d-printing setup, let alone a 3d one. So I have to scrap that idea for now. None of the screw holes on the converter board can fit the holes on the chassis, so I just taped the module down. It was a complete mess inside my SD-80 now, but at least everything still worked (until a couple minutes later). I did mention that I had the wish to make custom acrylic chassis for my SD-80 some day in the future, hopefully I can get this mess fixed by then.</p> +<p>I also bought some basic tools for soldering (Chinese knock-off of +Quick 936A, lead-based solder and solder wick – I was too dumb to +remember purchasing any flux) to make sure I can do the modding in my +dorm.</p> +<p>I waited a few days for all packages to arrive. After that I tested +every component I need and they worked just fine. It’s time to pull the +trigger. I started with desoldering the AC input socket. That went +decently smoothly. My confidence started to build up and proceeded to +desolder the original SMPS module, which is a rectangular daughter board +that has quite a few pins soldered on both sides of the board. Things +went horribly wrong (particularly because I didn’t have any flux and the +original lead-free solder refused to flow or blend with my leaded +solder) and I started ripping tracks off the base board. Finally I +decided it was an impossible task for me to desolder it without +completely destroying both boards, so I simply drilled the pins out of +the board. While the base board wasn’t totally destroyed, it was pretty +close. I soldered wires directly to the components on the base board +(because tracks on the other end have been ripped off). At this time my +soldering job was just totally awful because I was pissed and it was +super late into the night. Anyway, when I finally piecing everything +together, it somehow worked.</p> +<p>Next it was time to put everything back into place. I had the idea of +designing a 3d-printed holder for the USB Type-C extension cable that +fills the hole for the original AC socket, however I couldn’t even +afford a proper 2d-printing setup, let alone a 3d one. So I have to +scrap that idea for now. None of the screw holes on the converter board +can fit the holes on the chassis, so I just taped the module down. It +was a complete mess inside my SD-80 now, but at least everything still +worked (until a couple minutes later). I did mention that I had the wish +to make custom acrylic chassis for my SD-80 some day in the future, +hopefully I can get this mess fixed by then.</p> <div style="text-align:center;max-width:90%;"> -<a href="//filestorage.chrisoft.org/blog/img/sdp2_pdmodded.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sdp2_pdmodded.jpg"></a> <br>The USB-PD modded SD-80 +<a href="//filestorage.chrisoft.org/blog/img/sdp2_pdmodded.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sdp2_pdmodded.jpg"></a> <br>The USB-PD +modded SD-80 </div> -<h3 id="tocanch2" class="tvis">(Accidentally) Circuit bent SD-80</h3> -<p>I started messing around and decided to try to run the SD-80 without the ±15V rail. Everything except the front panel phones output and output 1 on the back panel worked just fine. This is not very surprising – all chips on the main board only takes <= 5V, and it makes sense to derivate all those voltages from the 5V rail. After a quick look at the service notes, I found that the ±15V rail is only used by the OpAmps in the final output stage of output 1, which is on the volume board.</p> -<p>And then something extremely stupid happened. Any proper electrical engineer will cringe hard. At this point I was getting cocky, and started randomly probing around with my multimeter on the volume board. I “accidentally” shorted the first two pins of the connector going from the main board into the volume board (pin 1 and pin 2 on CN7 of volume board). The output from the headphone jack immediately turns into complete garbage (severe distortions on low frequencies). The OpAmps chip on the volume board started getting ridiculously hot… crap! I still managed to fry something for an otherwise “perfect” modding project!</p> +<h3 id="tocanch2" class="tvis">(Accidentally) Circuit bent +SD-80</h3> +<p>I started messing around and decided to try to run the SD-80 without +the ±15V rail. Everything except the front panel phones output and +output 1 on the back panel worked just fine. This is not very surprising +– all chips on the main board only takes <= 5V, and it makes sense to +derivate all those voltages from the 5V rail. After a quick look at the +service notes, I found that the ±15V rail is only used by the OpAmps in +the final output stage of output 1, which is on the volume board.</p> +<p>And then something extremely stupid happened. Any proper electrical +engineer will cringe hard. At this point I was getting cocky, and +started randomly probing around with my multimeter on the volume board. +I “accidentally” shorted the first two pins of the connector going from +the main board into the volume board (pin 1 and pin 2 on CN7 of volume +board). The output from the headphone jack immediately turns into +complete garbage (severe distortions on low frequencies). The OpAmps +chip on the volume board started getting ridiculously hot… crap! I still +managed to fry something for an otherwise “perfect” modding project!</p> <p>Of course this is undesirable. So I had to find a fix to this.</p> -<p>Fortunately, nothing on the main board seemed to be hurt. I can just bypass the volume control and get the correct output on output 1 using some jumper wires. So the fault is contained in the volume board. I’ve basically sent -15V straight into the base of two transistors, but measuring those transistors didn’t reveal anything wrong with them. So I had to assume I have fried the amp chip (NJM4565). I got a few replacements (NJM4580, compatible spec-wise) from taobao, and replaced the “faulty” NJM4565 (still without using flux). But the audio output is still messed up and the opamp chip still gets very hot after the replacement. I decided to give up for now, and look into the thing later. Meanwhile I just tucked some of the wires from CN6 into CN7 so that I can still get analog output from output 1 on the back panel.</p> +<p>Fortunately, nothing on the main board seemed to be hurt. I can just +bypass the volume control and get the correct output on output 1 using +some jumper wires. So the fault is contained in the volume board. I’ve +basically sent -15V straight into the base of two transistors, but +measuring those transistors didn’t reveal anything wrong with them. So I +had to assume I have fried the amp chip (NJM4565). I got a few +replacements (NJM4580, compatible spec-wise) from taobao, and replaced +the “faulty” NJM4565 (still without using flux). But the audio output is +still messed up and the opamp chip still gets very hot after the +replacement. I decided to give up for now, and look into the thing +later. Meanwhile I just tucked some of the wires from CN6 into CN7 so +that I can still get analog output from output 1 on the back panel.</p> <table> <tbody><tr> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sdp2_volbrd_fixattempt.jpg"><img style="width: 33%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sdp2_volbrd_fixattempt.jpg"></a> <br>My terrible SMD soldering +<a href="//filestorage.chrisoft.org/blog/img/sdp2_volbrd_fixattempt.jpg"><img style="width: 33%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sdp2_volbrd_fixattempt.jpg"></a> <br>My +terrible SMD soldering </div> </td> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sdp2_bypass.jpg"><img style="width: 33%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sdp2_bypass.jpg"></a> <br>Recombined plug for volume board bypass +<a href="//filestorage.chrisoft.org/blog/img/sdp2_bypass.jpg"><img style="width: 33%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sdp2_bypass.jpg"></a> <br>Recombined plug +for volume board bypass </div> </td> </tr> @@ -343,69 +476,374 @@ for(let x of al) <div style="text-align:center;max-width:90%;"> <br> </div> -<h2 id="tocanch3" class="tvis">Recording Setup Update Part 1</h2> -<p>Since I have always wanted to record my SD-80 through a digital link (even before frying the analog output), I have been keeping an eye on cheap digital recording solutions. Modern professional audio interfaces never come with digital input on budget models. Among the older interfaces, UA-25(EX) from Roland (EDIROL / Cakewalk) seems to be a reasonable choice. There are also a bunch of different models from various brands of the same era that have digital inputs. However these models are virtually impossible to get in China. Then some cheapo consumer grade stuff caught my attention – several relatively nameless brands have “sound cards” for home theater uses that have digital I/O. Those are priced at roughly 200~300 Chinese yuan. Among those I found a more widely recognized brand called Terratec. They have PCI-e and USB sound cards that comes with digital I/O and are available for purchase in China. Price are on the higher end (300+ CNY), however still way cheaper than the cheapest professional audio interface that doesn’t have digital I/O (those start from ~800 CNY). Plus these models seem to have a reasonable Linux user base, so I got their Aureon 7.1 USB.</p> -<p>This thing feels extremely cheap on first sight, weights close to nothing, and is made entirely out of plastic. It comes with an extremely thin S/PDIF fiber optical cable which looks so fragile that a single touch may break it. It does work out of the box. ALSA recognizes it as “Aureon 7.1 USB” without further clue about the chip it uses, however the Windows driver is more telling. Its control panel associates the chip with a Taiwanese company called Cmedia, and the kernel driver is named <code>cm106.sys</code>. Upon further investigation this thing is likely to be based on their CM106 chip (which is an ancient solution from 2003), or its pin-compatible successor CM6206. I don’t have interest in disassembling it right now (update: confirmed by a teardown later. It’s indeed based around the CM6206), but either way it’s a cheap consumer grade solution.</p> -<p>SD-80’s digital output is fixed at 44100 Hz sample rate. So the sound card must also record at 44100 Hz to make a correct recording (unless it has internal resampling). This is easily doable under Windows (just select the appropriate sampling rate in the device properties dialog). It’s also reasonably easy with Jack, where you can just start the server on that specific device with the correct sampling rate. But this is not that easy to achieve for pulseaudio. By default, recent versions of pulseaudio auto detects cards with the <code>module-udev-detect</code> module, which doesn’t allow setting a different sample rate for a single sound card. Setting <code>alternate-sample-rate</code> doesn’t work either because this card supports digital signals at 48000Hz which in my case is the value for <code>default-sample-rate</code>, and therefore would not fallback to <code>alternate-sample-rate</code>. I had to write a small function to fix this:</p> +<h2 id="tocanch3" class="tvis">Recording Setup Update Part +1</h2> +<p>Since I have always wanted to record my SD-80 through a digital link +(even before frying the analog output), I have been keeping an eye on +cheap digital recording solutions. Modern professional audio interfaces +never come with digital input on budget models. Among the older +interfaces, UA-25(EX) from Roland (EDIROL / Cakewalk) seems to be a +reasonable choice. There are also a bunch of different models from +various brands of the same era that have digital inputs. However these +models are virtually impossible to get in China. Then some cheapo +consumer grade stuff caught my attention – several relatively nameless +brands have “sound cards” for home theater uses that have digital I/O. +Those are priced at roughly 200~300 Chinese yuan. Among those I found a +more widely recognized brand called Terratec. They have PCI-e and USB +sound cards that comes with digital I/O and are available for purchase +in China. Price are on the higher end (300+ CNY), however still way +cheaper than the cheapest professional audio interface that doesn’t have +digital I/O (those start from ~800 CNY). Plus these models seem to have +a reasonable Linux user base, so I got their Aureon 7.1 USB.</p> +<p>This thing feels extremely cheap on first sight, weights close to +nothing, and is made entirely out of plastic. It comes with an extremely +thin S/PDIF fiber optical cable which looks so fragile that a single +touch may break it. It does work out of the box. ALSA recognizes it as +“Aureon 7.1 USB” without further clue about the chip it uses, however +the Windows driver is more telling. Its control panel associates the +chip with a Taiwanese company called Cmedia, and the kernel driver is +named <code>cm106.sys</code>. Upon further investigation this thing is +likely to be based on their CM106 chip (which is an ancient solution +from 2003), or its pin-compatible successor CM6206. I don’t have +interest in disassembling it right now (update: confirmed by a teardown +later. It’s indeed based around the CM6206), but either way it’s a cheap +consumer grade solution.</p> +<p>SD-80’s digital output is fixed at 44100 Hz sample rate. So the sound +card must also record at 44100 Hz to make a correct recording (unless it +has internal resampling). This is easily doable under Windows (just +select the appropriate sampling rate in the device properties dialog). +It’s also reasonably easy with Jack, where you can just start the server +on that specific device with the correct sampling rate. But this is not +that easy to achieve for pulseaudio. By default, recent versions of +pulseaudio auto detects cards with the <code>module-udev-detect</code> +module, which doesn’t allow setting a different sample rate for a single +sound card. Setting <code>alternate-sample-rate</code> doesn’t work +either because this card supports digital signals at 48000Hz which in my +case is the value for <code>default-sample-rate</code>, and therefore +would not fallback to <code>alternate-sample-rate</code>. I had to write +a small function to fix this:</p> <pre><code>spdif_samplerate() { pacmd unload-module `pacmd list-modules | grep -B 2 Aureon_7 | awk '/index:/ {print $2}'` pacmd load-module module-alsa-card device_id=`awk '/Aureon 7\.1 USB$/{print $1}' /proc/asound/cards` name="usb-0ccd_Aureon_7.1_USB-00" card_name="alsa_card.usb-0ccd_Aureon_7.1_USB-00" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes avoid_resampling=no rate=44100 }</code></pre> -<p><del>Using a cheap consumer grade card does come with consequences. The recording seems to have a small DC bias – it’s not real DC though, the offset changes from time to time. When the input signal goes silent, the offset might differ from the offset when the signal was silent last time.</del> <a id="n2" href="#note2" class="note">[2]</a> For this reason, I always add a high-pass filter when using the material recorded by this sound card. With the HPF applied, this sound card does produce clearer digital recording than my Scarlett Solo with very cheap cables.</p> -<p>There’s no ASIO driver for this card either (Aureon 7.1 PCIe does have ASIO driver, but I can’t install that card on my laptop), which means I have to either use Steinberg’s generic ASIO driver, or ASIO4ALL, both of which are… kind of trash, but still usable. The card doesn’t have a bad latency issue though: it’s obviously way worse than the Scarlett, but still tolerable.</p> -<p>So that’s my <del>current</del> recording setup. I’m currently OK with it. However I’m not going to stick with it forever. I’ll upgrade to a UA-25(EX), or better yet, an SD-90 because that way I can use its ASIO output directly, plus I’ll be able to chain my SD-80 to it and use both at the same time.</p> -<h2 id="tocanch4" class="tvis">Recording Setup Update Part 2</h2> +<p><del>Using a cheap consumer grade card does come with consequences. +The recording seems to have a small DC bias – it’s not real DC though, +the offset changes from time to time. When the input signal goes silent, +the offset might differ from the offset when the signal was silent last +time.</del> <a id="n2" href="#note2" class="note">[2]</a> For this reason, I always add a high-pass filter +when using the material recorded by this sound card. With the HPF +applied, this sound card does produce clearer digital recording than my +Scarlett Solo with very cheap cables.</p> +<p>There’s no ASIO driver for this card either (Aureon 7.1 PCIe does +have ASIO driver, but I can’t install that card on my laptop), which +means I have to either use Steinberg’s generic ASIO driver, or ASIO4ALL, +both of which are… kind of trash, but still usable. The card doesn’t +have a bad latency issue though: it’s obviously way worse than the +Scarlett, but still tolerable.</p> +<p>So that’s my <del>current</del> recording setup. I’m currently OK +with it. However I’m not going to stick with it forever. I’ll upgrade to +a UA-25(EX), or better yet, an SD-90 because that way I can use its ASIO +output directly, plus I’ll be able to chain my SD-80 to it and use both +at the same time.</p> +<h2 id="tocanch4" class="tvis">Recording Setup Update Part +2</h2> <p>(This part is written Q4 2021)</p> -<p>Yes I did upgrade to a UA-25 (non-EX). I got mine for about $60 (after a long struggle against eBay’s virtually non-existent customer service to lift a stupid suspension on my account).</p> -<p>Gentoo Linux handles this new interface without any problem. The troublesome part is Windows (again). Just like the SD-80, Roland didn’t release any Windows 10 driver for the UA-25. <a href="https://chrisoft.org/blog/post/2019-04-25.html#tocanch4">The trick</a> I used to make their SD-80 Windows 8/8.1 driver install on Windows 10 worked fine, and the driver installed correctly. But things quickly went down hill. Whenever I open an application that uses ASIO, the driver freaks out and causes audio dropouts like crazy. This glitch makes the driver basically unusable.</p> -<p>I tried drivers for different Windows versions. Nothing changed. When I was desperate and searching around the web, I discovered that UA-25EX has an official Windows 10 driver. UA-25EX is virtually the same as UA-25 except it comes with an improved limiter section which I assume has largely nothing to do with the driver. So I decided to try some “mad hax”.</p> -<p>Windows driver for UA-25EX is only available from Microsoft as a Windows update package. Roland says if you have a UA-25EX, the package will automatically install itself once you plug it in. But I don’t have a UA-25EX: I only have a UA-25. So I had to go to the Windows Update Catalog, looked for the driver package there, and download the build for my computer (which turned out to be much harder than it needs to be, but I won’t go deeper into that here). I extracted the package, and modified the USB product ID the driver is designed for in the INF file:</p> +<p>Yes I did upgrade to a UA-25 (non-EX). I got mine for about $60 +(after a long struggle against eBay’s virtually non-existent customer +service to lift a stupid suspension on my account).</p> +<p>Gentoo Linux handles this new interface without any problem. The +troublesome part is Windows (again). Just like the SD-80, Roland didn’t +release any Windows 10 driver for the UA-25. <a href="https://chrisoft.org/blog/post/2019-04-25.html#tocanch4">The +trick</a> I used to make their SD-80 Windows 8/8.1 driver install on +Windows 10 worked fine, and the driver installed correctly. But things +quickly went down hill. Whenever I open an application that uses ASIO, +the driver freaks out and causes audio dropouts like crazy. This glitch +makes the driver basically unusable.</p> +<p>I tried drivers for different Windows versions. Nothing changed. When +I was desperate and searching around the web, I discovered that UA-25EX +has an official Windows 10 driver. UA-25EX is virtually the same as +UA-25 except it comes with an improved limiter section which I assume +has largely nothing to do with the driver. So I decided to try some “mad +hax”.</p> +<p>Windows driver for UA-25EX is only available from Microsoft as a +Windows update package. Roland says if you have a UA-25EX, the package +will automatically install itself once you plug it in. But I don’t have +a UA-25EX: I only have a UA-25. So I had to go to the Windows Update +Catalog, looked for the driver package there, and download the build for +my computer (which turned out to be much harder than it needs to be, but +I won’t go deeper into that here). I extracted the package, and modified +the USB product ID the driver is designed for in the INF file:</p> <pre><code>%DriverDeviceDesc%=DriverInstall, USB\VID_0582&PID_00E6 ; UA-25EX</code></pre> -<p>Just change <code>PID_00E6</code> to <code>PID_0074</code> (and also the comment if you wish). AND IT FRICKING INSTALLED. ASIO also worked perfectly. (Insert a thousand-word essay trashing Roland’s bad practice here.)</p> -<p>So did the upgrade work? Nope. The DC bias is still there. Now it’s more likely that the DC bias is from the SD-80 itself. Also another very telling clue is that when the sound generator inside the SD-80 is reset, the DC bias immediately goes away. I did some additional research on the Internet and discovered people have theorized that the DC bias is from the effect processor. They are having a <a href="https://gearspace.com/board/electronic-music-instruments-and-electronic-music-production/1302162-roland-xv5080-spdif-issue.html">similar problem</a> with their XV-5080 and XV-5050 as well, both of which have the same synth engine as the SD-80. By replicating their experiments and getting the same result, I personally conclude that the DC bias comes from the amp / gain / filter section of the integrated effects processor. So I guess I’ll have to keep using high-pass filters on the output for now.</p> -<p>So the only upgrade is that now I can record S/PDIF signal with native ASIO. Besides that, it’s actually a downgrade: Output from the computer will be muted if the digital input of the UA-25 is enabled. This forced me to keep using the analog input for monitoring.</p> -<h2 id="tocanch5" class="tvis">Recording Setup Update Part 3, 4, 5…</h2> +<p>Just change <code>PID_00E6</code> to <code>PID_0074</code> (and also +the comment if you wish). AND IT FRICKING INSTALLED. ASIO also worked +perfectly. (Insert a thousand-word essay trashing Roland’s bad practice +here.)</p> +<p>So did the upgrade work? Nope. The DC bias is still there. Now it’s +more likely that the DC bias is from the SD-80 itself. Also another very +telling clue is that when the sound generator inside the SD-80 is reset, +the DC bias immediately goes away. I did some additional research on the +Internet and discovered people have theorized that the DC bias is from +the effect processor. They are having a <a href="https://gearspace.com/board/electronic-music-instruments-and-electronic-music-production/1302162-roland-xv5080-spdif-issue.html">similar +problem</a> with their XV-5080 and XV-5050 as well, both of which have +the same synth engine as the SD-80. By replicating their experiments and +getting the same result, I personally conclude that the DC bias comes +from the amp / gain / filter section of the integrated effects +processor. So I guess I’ll have to keep using high-pass filters on the +output for now.</p> +<p>So the only upgrade is that now I can record S/PDIF signal with +native ASIO. Besides that, it’s actually a downgrade: Output from the +computer will be muted if the digital input of the UA-25 is enabled. +This forced me to keep using the analog input for monitoring.</p> +<h2 id="tocanch5" class="tvis">Recording Setup Update Part +3, 4, 5…</h2> <p>Yes I did upgrade. (again!!)</p> -<p>I saw a UA-101 in a listing for $80. I bought it. Then there was a whole saga which ended in me getting two of them for the price of one. And then I saw a SD-90 for $120… you know what happened.</p> -<p>This is getting too long to write in detail here. I’ll give detailed information on my current recording setup in a new post, if I care to write it at all.</p> +<p>I saw a UA-101 in a listing for $80. I bought it. Then there was a +whole saga which ended in me getting two of them for the price of one. +And then I saw a SD-90 for $120… you know what happened.</p> +<p>This is getting too long to write in detail here. I’ll give detailed +information on my current recording setup in a new post, if I care to +write it at all.</p> <h2 id="tocanch6" class="tvis">Rompler Preservation</h2> -<p>Kalas was extremely keen on preserving the sounds of SD-90/80 during our communications. I have the intention to keep these legendary Roland sounds around long into the future as well. We discussed the following possibilities. Note that due to the locked-down nature of SD-90/80, we referred to them mostly as “Romplers”, but these methods listed below apply to those expandable models as well, especially considering they are nothing but romplers that you can add more ROMs to, and the architecture of Roland’s PCM synth.</p> -<p>In this section I’ll start using the word “SD-90” and “SD-80” interchangeably, and by saying “SD-90”, I’m actually referring to the synthesizer module built into it. If Roland was being honest when they were saying “the newly developed multitimbral MIDI sound module, as built into the well-received SD-90” when they were introducing the SD-80 <a id="n3" href="#note3" class="note">[3]</a>, it should be safe to assume they are virtually the same thing. I know this is kind of sloppy. If you want to read more on this, checkout the <a href="#tocanch33">“More on SD-80 vs SD-90 vs SD-20”</a> section.</p> +<p>Kalas was extremely keen on preserving the sounds of SD-90/80 during +our communications. I have the intention to keep these legendary Roland +sounds around long into the future as well. We discussed the following +possibilities. Note that due to the locked-down nature of SD-90/80, we +referred to them mostly as “Romplers”, but these methods listed below +apply to those expandable models as well, especially considering they +are nothing but romplers that you can add more ROMs to, and the +architecture of Roland’s PCM synth.</p> +<p>In this section I’ll start using the word “SD-90” and “SD-80” +interchangeably, and by saying “SD-90”, I’m actually referring to the +synthesizer module built into it. If Roland was being honest when they +were saying “the newly developed multitimbral MIDI sound module, as +built into the well-received SD-90” when they were introducing the SD-80 +<a id="n3" href="#note3" class="note">[3]</a>, it should be +safe to assume they are virtually the same thing. I know this is kind of +sloppy. If you want to read more on this, checkout the <a href="#tocanch33">“More on SD-80 vs SD-90 vs SD-20”</a> section.</p> <h3 id="tocanch7" class="tvis">Emulation</h3> -<p>This method was brought up by Kalas. Indeed there are a couple of sound modules / synthesizers that has been emulated with reasonable success. <a href="https://github.com/munt/munt">Munt</a> has an amazing emulation of Roland’s LA synthesis found in the MT-32 or D-50. <a id="n4" href="#note4" class="note">[4]</a> Yamaha’s FM synthesis chips have been reverse engineered from inside out: there are <a href="https://github.com/gtaylormb/opl3_fpga">implementations on FPGA</a>, multiple nearly perfect software implementations, and other bizarre stuff. MAME has emulation for multiple MU-series models, plus work has been put into making an emulated SC-55 in MAME.</p> -<p>However, I personally don’t think emulation is the way to go for SD-90/80. The success (or lack thereof) of these emulated models does have their reasons:</p> +<p>This method was brought up by Kalas. Indeed there are a couple of +sound modules / synthesizers that has been emulated with reasonable +success. <a href="https://github.com/munt/munt">Munt</a> has an amazing +emulation of Roland’s LA synthesis found in the MT-32 or D-50. +<a id="n4" href="#note4" class="note">[4]</a> Yamaha’s FM +synthesis chips have been reverse engineered from inside out: there are +<a href="https://github.com/gtaylormb/opl3_fpga">implementations on +FPGA</a>, multiple nearly perfect software implementations, and other +bizarre stuff. MAME has emulation for multiple MU-series models, plus +work has been put into making an emulated SC-55 in MAME.</p> +<p>However, I personally don’t think emulation is the way to go for +SD-90/80. The success (or lack thereof) of these emulated models does +have their reasons:</p> <ul> -<li>Emulation of Yamaha’s FM chips is a success because those chips are available to third-party sound card makers, and therefore have public datasheets that contains critical information for emulating the chip, which includes register mapping, and the detailed architecture of the FM synthesizer. This drastically decreased the amount of reverse engineering required to get a perfect emulated implementation. Roland has never made their synthesizer chips available to third-party vendors, and therefore it’s impossible to take advantage of public datasheets.</li> -<li>Emulation of several early gaming consoles’ sound system has been successful because +<li>Emulation of Yamaha’s FM chips is a success because those chips are +available to third-party sound card makers, and therefore have public +datasheets that contains critical information for emulating the chip, +which includes register mapping, and the detailed architecture of the FM +synthesizer. This drastically decreased the amount of reverse +engineering required to get a perfect emulated implementation. Roland +has never made their synthesizer chips available to third-party vendors, +and therefore it’s impossible to take advantage of public +datasheets.</li> +<li>Emulation of several early gaming consoles’ sound system has been +successful because <ul> <li>They are relatively sample.</li> -<li>Similar to Yamaha’s FM chips, programmers can also directly interface with them. Therefore their programming manuals have detailed description on how sound generation works in the chips. SD-90/80’s synthesizer chip XV meets neither of these two criteria.</li> +<li>Similar to Yamaha’s FM chips, programmers can also directly +interface with them. Therefore their programming manuals have detailed +description on how sound generation works in the chips. SD-90/80’s +synthesizer chip XV meets neither of these two criteria.</li> </ul></li> -<li>Most emulated sound modules in MAME have been a failure in terms of real-world usability. The emulated MU-series either freezes, produces no sound at all, or makes loud unexpected noise when playing the demo track. The SC-55 emulation barely works – they only got the CPU working and running its dumped control ROM. Please don’t get me wrong: the fact that some emulated MU model could make any sound is almost a miracle for me, and definitely a huge achievement despite the far-from-ideal results it currently has, as Yamaha’s sample based synth chips (<code>GEW/SWP</code> stuff) are no easy nut to crack. This approach is highly unlikely to work for the SD-90/80 because unlike gaming consoles, getting the CPU to run its system code doesn’t mean much for synthesizer emulation. It’s the emulation of the actual synth/DSP chip that matters. And the XV chip found in SD-90/80 is a <strong>monstrosity</strong> compared to the early SWP chip in the MU-series. For this reason, I find a pure emulation based solution difficult to implement for SD-90/80.</li> -<li>Munt is successful because instead of an instruction-to-instruction emulation, it’s more like a software reimplementation of the LA synth. It doesn’t try to run the control ROM on an emulated Intel 8098 CPU, but instead only use it for determining some characteristics of the software implementation of the LA synth. This approach makes the most sense when trying to recreate SD-90/80 in software form, but still definitely require tons of reverse engineering (either blackbox or whitebox).</li> +<li>Most emulated sound modules in MAME have been a failure in terms of +real-world usability. The emulated MU-series either freezes, produces no +sound at all, or makes loud unexpected noise when playing the demo +track. The SC-55 emulation barely works – they only got the CPU working +and running its dumped control ROM. Please don’t get me wrong: the fact +that some emulated MU model could make any sound is almost a miracle for +me, and definitely a huge achievement despite the far-from-ideal results +it currently has, as Yamaha’s sample based synth chips +(<code>GEW/SWP</code> stuff) are no easy nut to crack. This approach is +highly unlikely to work for the SD-90/80 because unlike gaming consoles, +getting the CPU to run its system code doesn’t mean much for synthesizer +emulation. It’s the emulation of the actual synth/DSP chip that matters. +And the XV chip found in SD-90/80 is a <strong>monstrosity</strong> +compared to the early SWP chip in the MU-series. For this reason, I find +a pure emulation based solution difficult to implement for +SD-90/80.</li> +<li>Munt is successful because instead of an instruction-to-instruction +emulation, it’s more like a software reimplementation of the LA synth. +It doesn’t try to run the control ROM on an emulated Intel 8098 CPU, but +instead only use it for determining some characteristics of the software +implementation of the LA synth. This approach makes the most sense when +trying to recreate SD-90/80 in software form, but still definitely +require tons of reverse engineering (either blackbox or whitebox).</li> </ul> -<p>For these reasons, I don’t think an OPL3-level emulation of SD-90/80 is possible <a id="n5" href="#note5" class="note">[5]</a>. However, I will discuss an approach that resembles Munt’s in the <a href="#tocanch8">Dumping and Deciphering</a> section.</p> +<p>For these reasons, I don’t think an OPL3-level emulation of SD-90/80 +is possible <a id="n5" href="#note5" class="note">[5]</a>. However, I will discuss an approach that +resembles Munt’s in the <a href="#tocanch8">Dumping and Deciphering</a> +section.</p> <h3 id="tocanch8" class="tvis">Sampling the Rompler</h3> -<p>Many people have attempted to sample the SD-90. We already have the (in)famous THFont from forever ago that contains some samples from the SD-90, plus <a href="https://musical-artifacts.com/artifacts/1367">these</a> efforts to create a complete set of sampled instruments from the SD-90. However, these folks aren’t doing it in the most efficient way IMHO. Since the SD-90/80 is extremely editable, one can craft presets ideal for raw sample extraction (no filters, no LFO, just a plain tone with a constant amplitude envelope). Since many preset instruments in the SD-90/80 consist of multiple layers using different samples, instead of sampling the patches, one can sample every individual waveform and layer the samples in a way similar to the original presets to make close imitations of SD-90/80 instruments. If done properly under ideal conditions, the resulting sample library should be around the same size of SD-90/80’s sample ROM, but decompressed (my guess is ~64 MiB <a id="n6" href="#note6" class="note">[6]</a>).</p> -<p>If you’re only going to use the vanilla SD patches without any sort of modification (including filter response, envelope, and effect parameters), those existing samples will work just fine and they are probably the most accurate out there if recorded properly. Of course, the “efficient” approach of sampling sacrifices some level of that accuracy (due to a different engine being used for playing back the samples). But in exchange you get the highest level of freedom to recombine the raw samples into custom patches including tweaking all possible parameters and effects available in the synth engine of your choice (which is a huge plus for me personally, as I love to create whacky patches).</p> -<p>One problem for extracting the samples is that, a single waveform in the SD-80 may contain different samples assigned for different key ranges. This is often called a “multisample” by some sources. The way the samples are mapped to the keys must be figured out before actually sampling them. I have written a small(ish) python script to do exactly that. It records the SD-80 playing two different keys at the same pitch one after another, and compare them by calculating the correlation. If the correlation is lower than a threshold, the two keys use different samples. This approach works reasonably well for most samples, but for a few analog synth samples, it works poorly. For those samples, I had to resort to relying on the human ear (DTW, dynamic time warping, is also used sometimes, but it usually has poor results for these samples as well). Also the XV engine have some weird quirks near the keys C7-D8 (96-110). The actual waveform produced within that range varies very slightly from time to time. This is possibly due to the effect of <a href="https://en.wikipedia.org/wiki/Aliasing">aliasing</a> becoming prominent for these high-pitched notes. I have already figured out key-sample mapping for all multisamples (they are not guaranteed to be correct, due to reasons mentioned above).</p> -<p>Another problem is looping. Roland uses sample looping extensively in their PCM synths. It’s basically their secret sauce to squeeze thousands of instruments into a unit with only tens of megabytes of samples. Sample loop points can also be computed using cross-correlation. But is nowhere near perfect. Of course it can be done manually, but that would be a tedious task.</p> +<p>Many people have attempted to sample the SD-90. We already have the +(in)famous THFont from forever ago that contains some samples from the +SD-90, plus <a href="https://musical-artifacts.com/artifacts/1367">these</a> efforts to +create a complete set of sampled instruments from the SD-90. However, +these folks aren’t doing it in the most efficient way IMHO. Since the +SD-90/80 is extremely editable, one can craft presets ideal for raw +sample extraction (no filters, no LFO, just a plain tone with a constant +amplitude envelope). Since many preset instruments in the SD-90/80 +consist of multiple layers using different samples, instead of sampling +the patches, one can sample every individual waveform and layer the +samples in a way similar to the original presets to make close +imitations of SD-90/80 instruments. If done properly under ideal +conditions, the resulting sample library should be around the same size +of SD-90/80’s sample ROM, but decompressed (my guess is ~64 MiB +<a id="n6" href="#note6" class="note">[6]</a>).</p> +<p>If you’re only going to use the vanilla SD patches without any sort +of modification (including filter response, envelope, and effect +parameters), those existing samples will work just fine and they are +probably the most accurate out there if recorded properly. Of course, +the “efficient” approach of sampling sacrifices some level of that +accuracy (due to a different engine being used for playing back the +samples). But in exchange you get the highest level of freedom to +recombine the raw samples into custom patches including tweaking all +possible parameters and effects available in the synth engine of your +choice (which is a huge plus for me personally, as I love to create +whacky patches).</p> +<p>One problem for extracting the samples is that, a single waveform in +the SD-80 may contain different samples assigned for different key +ranges. This is often called a “multisample” by some sources. The way +the samples are mapped to the keys must be figured out before actually +sampling them. I have written a small(ish) python script to do exactly +that. It records the SD-80 playing two different keys at the same pitch +one after another, and compare them by calculating the correlation. If +the correlation is lower than a threshold, the two keys use different +samples. This approach works reasonably well for most samples, but for a +few analog synth samples, it works poorly. For those samples, I had to +resort to relying on the human ear (DTW, dynamic time warping, is also +used sometimes, but it usually has poor results for these samples as +well). Also the XV engine have some weird quirks near the keys C7-D8 +(96-110). The actual waveform produced within that range varies very +slightly from time to time. This is possibly due to the effect of <a href="https://en.wikipedia.org/wiki/Aliasing">aliasing</a> becoming +prominent for these high-pitched notes. I have already figured out +key-sample mapping for all multisamples (they are not guaranteed to be +correct, due to reasons mentioned above).</p> +<p>Another problem is looping. Roland uses sample looping extensively in +their PCM synths. It’s basically their secret sauce to squeeze thousands +of instruments into a unit with only tens of megabytes of samples. +Sample loop points can also be computed using cross-correlation. But is +nowhere near perfect. Of course it can be done manually, but that would +be a tedious task.</p> <p>No actual recording of the raw samples have been done by me yet.</p> -<p>I have also dumped the instrument configuration for all preset instruments and rhythm sets as part of my SD-80 dumping project (for SD-80’s native mode only. I’m not sure whether this is doable for its GS/XGLite instruments without a lot of reverse engineering, but nobody cares about those anyway). For now, it can be used to recreate parameter-accurate SD-80 patches in Roland’s SRX/Zenology plugins. However it’s not yet in a very human-readable form (either raw binary registers dump or decimal values with field names).</p> -<p>Once the samples are there, one can easily piece them together within the sample playback engine of their choice, be it HALion, KONTAKT, or even just soundfont synthesizers. Sure the feature set of each sample-based synth engine is not exactly the same, but I think decent results could be achieved for most instruments.</p> +<p>I have also dumped the instrument configuration for all preset +instruments and rhythm sets as part of my SD-80 dumping project (for +SD-80’s native mode only. I’m not sure whether this is doable for its +GS/XGLite instruments without a lot of reverse engineering, but nobody +cares about those anyway). For now, it can be used to recreate +parameter-accurate SD-80 patches in Roland’s SRX/Zenology plugins. +However it’s not yet in a very human-readable form (either raw binary +registers dump or decimal values with field names).</p> +<p>Once the samples are there, one can easily piece them together within +the sample playback engine of their choice, be it HALion, KONTAKT, or +even just soundfont synthesizers. Sure the feature set of each +sample-based synth engine is not exactly the same, but I think decent +results could be achieved for most instruments.</p> <h3 id="tocanch9" class="tvis">Dumping and Deciphering</h3> -<p>The wave ROM in the SD-80 is a standard part despite the custom Roland engravement on it <a id="n7" href="#note7" class="note">[7]</a>. This is expected because Roland has been using standard mask ROM parts from various manufacturers for the wave ROM. This means the content of SD-80’s wave ROM can be easily dumped.</p> -<p>This might be shocking for some of the readers, but Roland does compress their samples. This is evident from the specification of XV-5080 “Wave memory: 64MB (16-bit linear format)” while the XV-5080 only has 32 MiB wave ROM. The compression, previously unknown to me, has been identified to be a variant of the differential pulse-code modulation (DPCM) called FCE-DPCM by <a href="http://www.dtech.lv/techarticles_roland_exp.html">some amazing person</a>. The same person seemed also figured out the structure of the wave ROM used by sample-based synthesizers from Roland of that general era. Unfortunately, I wasn’t able to find the article on the technical details of the compression method at the time of writing. Anyway, hats off to Edward of dtech.lv!</p> -<p>I <strong>will surely</strong> make a dump of the wave ROMs of my SD-80. However, I want to do it in an nondestructive manner – I don’t want to get a ROM dump and an unusable SD-80 (or end up with no valid ROM dump and an unusable SD-80). Since I have proved my SMT soldering job is terrible and shall never be in the vicinity of a SMT board holding a soldering iron or hot air gun, I might try some clipping the chip instead. I’m considering to try <a href="https://www.360-clip.com/uni-48.htm">this</a> clip from 360-clip. It claims to be applicable to any 48-pin TSOP chips. If that’s true, with the help of this clip and a Raspberry Pi <a id="n8" href="#note8" class="note">[8]</a>, I can suck that juicy content out of the wave ROM chips of the SD-80.</p> -<p>Once we have the ROM dump, we can start trying to figure out its structure. If we somehow managed to do that, we would be able to feed the decompressed samples together with the already dumped patch parameters to some existing or new, custom sample-based software synthesizer, and achieve decent results mimicking the SD-90/80. Patches that make use of MFX would certainly be a pain to deal with. However one can always simulate MFX with external DAW effects. To hear the difference MFX makes for various preset patches that use it, see the <a href="#tocanch37">“What role does MFX play?”</a> section.</p> -<p>I believe this approach is very similar to that one used by Munt (although I only read a small part of Munt’s code base, and I didn’t read anything about their reverse engineering approach). The SH3 CPU plays a relatively minor part in the tone generation of SD-80. Instead, we should focus on replicating the sounds of the XV engine. Also, an logic-level reverse engineering of the XV chip doesn’t seem reasonable because it’s such a huge and complex chip (or rather, a huge gate array). Just save the hassle, treat it like a blackbox and try to reproduce its output using a software implementation should be able to produce acceptable result on its own.</p> -<h4 id="tocanch10" class="tvis">Extra rambling about the ROM chip</h4> -<p>In the part number of <code>μPD23C128040ALGY-***-MJH/MKH</code>, the <code>***</code> part is the ROM code. When a mask ROM chip is commissioned, the customer (Roland in this case) needs to submit the desired ROM content and their choice for various other options (in case of <code>μPD23C128040ALGY</code>, they can choose how the logic level on a certain pin controls the outputs). The manufacturer then arrange the mask according to this information and assigns a ROM code to this specific mask <a id="n9" href="#note9" class="note">[9]</a>. Therefore, for two chips of the same type, if they have the same ROM code, their contents should be identical. This way we can guess with fair amount of certainty that the XV-3080, XV-5080 and XV-5050 have identical wave ROM contents (they all use <code>μPD23C128040ALGY-849-MJH</code> and <code>μPD23C128040ALGY-850-MJH</code>).</p> -<p>Among the chips with Roland markings in the SD-80, the XV chip and 8-bit MCU with Roland-programmed ROM has other markings that matches Roland’s internal part numbers (the numbers with a prefix R, like <code>R01455956</code> and <code>R02902867</code>), and followed by a indicative part number of the actual chip (<code>137</code> and <code>RA08-503</code>). However, none of these features matches on the wave ROM chips. The wave ROM chips has internal part number <code>R02678601</code> and <code>R02678612</code>, while the numbers on the service manual are <code>03010612</code> and <code>03010623</code> respectively. The indicative part also doesn’t match either: the chips in my unit have <code>23C128L-529J</code> and <code>23C128L-535K</code>. While the J/K variant and the <code>23C128L</code> part does match, what I presumed is the ROM code doesn’t (529 vs 525 on IC28, 535 vs 526 on IC29). What does this mean? I don’t really know. My SD-80 is built relatively late into production (date code on the main board is 2004-08-27, date on the service manual is May 2002 – when the SD-80 was initially released). Maybe Roland did revise the wave ROM content. If that’s the case, it would be interesting to find one with the original ROMs and compare them. I wouldn’t expect there to be any significant differences, though.</p> +<p>The wave ROM in the SD-80 is a standard part despite the custom +Roland engravement on it <a id="n7" href="#note7" class="note">[7]</a>. This is expected because Roland has been +using standard mask ROM parts from various manufacturers for the wave +ROM. This means the content of SD-80’s wave ROM can be easily +dumped.</p> +<p>This might be shocking for some of the readers, but Roland does +compress their samples. This is evident from the specification of +XV-5080 “Wave memory: 64MB (16-bit linear format)” while the XV-5080 +only has 32 MiB wave ROM. The compression, previously unknown to me, has +been identified to be a variant of the differential pulse-code +modulation (DPCM) called FCE-DPCM by <a href="http://www.dtech.lv/techarticles_roland_exp.html">some amazing +person</a>. The same person seemed also figured out the structure of the +wave ROM used by sample-based synthesizers from Roland of that general +era. Unfortunately, I wasn’t able to find the article on the technical +details of the compression method at the time of writing. Anyway, hats +off to Edward of dtech.lv!</p> +<p>I <strong>will surely</strong> make a dump of the wave ROMs of my +SD-80. However, I want to do it in an nondestructive manner – I don’t +want to get a ROM dump and an unusable SD-80 (or end up with no valid +ROM dump and an unusable SD-80). Since I have proved my SMT soldering +job is terrible and shall never be in the vicinity of a SMT board +holding a soldering iron or hot air gun, I might try some clipping the +chip instead. I’m considering to try <a href="https://www.360-clip.com/uni-48.htm">this</a> clip from 360-clip. +It claims to be applicable to any 48-pin TSOP chips. If that’s true, +with the help of this clip and a Raspberry Pi <a id="n8" href="#note8" class="note">[8]</a>, I +can suck that juicy content out of the wave ROM chips of the SD-80.</p> +<p>Once we have the ROM dump, we can start trying to figure out its +structure. If we somehow managed to do that, we would be able to feed +the decompressed samples together with the already dumped patch +parameters to some existing or new, custom sample-based software +synthesizer, and achieve decent results mimicking the SD-90/80. Patches +that make use of MFX would certainly be a pain to deal with. However one +can always simulate MFX with external DAW effects. To hear the +difference MFX makes for various preset patches that use it, see the <a href="#tocanch37">“What role does MFX play?”</a> section.</p> +<p>I believe this approach is very similar to that one used by Munt +(although I only read a small part of Munt’s code base, and I didn’t +read anything about their reverse engineering approach). The SH3 CPU +plays a relatively minor part in the tone generation of SD-80. Instead, +we should focus on replicating the sounds of the XV engine. Also, an +logic-level reverse engineering of the XV chip doesn’t seem reasonable +because it’s such a huge and complex chip (or rather, a huge gate +array). Just save the hassle, treat it like a blackbox and try to +reproduce its output using a software implementation should be able to +produce acceptable result on its own.</p> +<h4 id="tocanch10" class="tvis">Extra rambling about the ROM +chip</h4> +<p>In the part number of <code>μPD23C128040ALGY-***-MJH/MKH</code>, the +<code>***</code> part is the ROM code. When a mask ROM chip is +commissioned, the customer (Roland in this case) needs to submit the +desired ROM content and their choice for various other options (in case +of <code>μPD23C128040ALGY</code>, they can choose how the logic level on +a certain pin controls the outputs). The manufacturer then arrange the +mask according to this information and assigns a ROM code to this +specific mask <a id="n9" href="#note9" class="note">[9]</a>. Therefore, for two +chips of the same type, if they have the same ROM code, their contents +should be identical. This way we can guess with fair amount of certainty +that the XV-3080, XV-5080 and XV-5050 have identical wave ROM contents +(they all use <code>μPD23C128040ALGY-849-MJH</code> and +<code>μPD23C128040ALGY-850-MJH</code>).</p> +<p>Among the chips with Roland markings in the SD-80, the XV chip and +8-bit MCU with Roland-programmed ROM has other markings that matches +Roland’s internal part numbers (the numbers with a prefix R, like +<code>R01455956</code> and <code>R02902867</code>), and followed by a +indicative part number of the actual chip (<code>137</code> and +<code>RA08-503</code>). However, none of these features matches on the +wave ROM chips. The wave ROM chips has internal part number +<code>R02678601</code> and <code>R02678612</code>, while the numbers on +the service manual are <code>03010612</code> and <code>03010623</code> +respectively. The indicative part also doesn’t match either: the chips +in my unit have <code>23C128L-529J</code> and <code>23C128L-535K</code>. +While the J/K variant and the <code>23C128L</code> part does match, what +I presumed is the ROM code doesn’t (529 vs 525 on IC28, 535 vs 526 on +IC29). What does this mean? I don’t really know. My SD-80 is built +relatively late into production (date code on the main board is +2004-08-27, date on the service manual is May 2002 – when the SD-80 was +initially released). Maybe Roland did revise the wave ROM content. If +that’s the case, it would be interesting to find one with the original +ROMs and compare them. I wouldn’t expect there to be any significant +differences, though.</p> <h3 id="tocanch11" class="tvis">SD-20 MIDI File Converter</h3> -<p>This extremely intriguing piece of software is brought up by Kalas during our communications. At the time of writing, this application can be still found <a href="https://www.roland.com/jp/support/by_product/sd-20/">here</a>. The installer can only proceed if an SD-20 is detected. This can be easily circumvented by using a InstallSheld extractor. The converter does try to access a registry key <code>HKLM\Software\Wow6432Node\Edirol\SD-20 MIDI File Converter\BaseDataFile</code>, which should be set to a string pointing to the url of its param.dat file. However, even with this key set, the converter still refuse to do anything, saying it failed to initialize. By the way even with an SD-20 connected to the computer via USB, the converter still refuses to start on Windows 10.</p> -<p>However, this kind of nonsense is not going to stop me. I quickly found cracks floating around on the Internet. This converter is extremely simplistic: you pick the midi file to convert, it spits the wav file into the same folder. Here are some quick samples.</p> +<p>This extremely intriguing piece of software is brought up by Kalas +during our communications. At the time of writing, this application can +be still found <a href="https://www.roland.com/jp/support/by_product/sd-20/">here</a>. The +installer can only proceed if an SD-20 is detected. This can be easily +circumvented by using a InstallSheld extractor. The converter does try +to access a registry key +<code>HKLM\Software\Wow6432Node\Edirol\SD-20 MIDI File Converter\BaseDataFile</code>, +which should be set to a string pointing to the url of its param.dat +file. However, even with this key set, the converter still refuse to do +anything, saying it failed to initialize. By the way even with an SD-20 +connected to the computer via USB, the converter still refuses to start +on Windows 10.</p> +<p>However, this kind of nonsense is not going to stop me. I quickly +found cracks floating around on the Internet. This converter is +extremely simplistic: you pick the midi file to convert, it spits the +wav file into the same folder. Here are some quick samples.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -429,13 +867,25 @@ SD-20 Converter <tr> </tr><tr> <td colspan="2"> -AMEDLEY.MID by Earl Gray Fowler from Voyetra Technologies, arranged for SD-80 (Native Mode) +AMEDLEY.MID by Earl Gray Fowler from Voyetra Technologies, arranged for +SD-80 (Native Mode) </td> </tr> </tbody></table> </div> -<p>Used instruments: St.Strings, St.Timpani, St.Harp, St.Fr Horns, Flute vib, St.Tubular, St.Harp, St.Xylophone, St.Music Box, St.Room, Bassoon vib, SpaceVoice 3, Atmosphere 3, Ice Rain 3, PanFlute vib, Bird Tweet, Seashore, Sweep Pad 3, Rockabilly, St.Kalimba, Piccolo vib, Steel Drums, Tuba vib, Romantic Tp, St.Banjo, Trombone vib, JazzClarinet, Gunshot, Clavi Bass 3, St.Brass, Dist.Gt 2, St.Orc Hit, Jazz Organ 2, PhaseFrtless, Solo Vox 3, Reed Romance, Ice Rain 2, St.Power, Oct.JP Saw, SH-2 Lead, Jazz Slap, OverdriveGt2, Applause.</p> -<p>Reed Romance and SH-2 Lead are from the special 2 set, therefore cannot be used by the SD-20 MIDI File Converter. They are substituted by Violin 2 vib and Warm SynHorn automatically. A single SD-80 system exclusive DT1 message is used to change the patch volume of SH-2 Lead.</p> +<p>Used instruments: St.Strings, St.Timpani, St.Harp, St.Fr Horns, Flute +vib, St.Tubular, St.Harp, St.Xylophone, St.Music Box, St.Room, Bassoon +vib, SpaceVoice 3, Atmosphere 3, Ice Rain 3, PanFlute vib, Bird Tweet, +Seashore, Sweep Pad 3, Rockabilly, St.Kalimba, Piccolo vib, Steel Drums, +Tuba vib, Romantic Tp, St.Banjo, Trombone vib, JazzClarinet, Gunshot, +Clavi Bass 3, St.Brass, Dist.Gt 2, St.Orc Hit, Jazz Organ 2, +PhaseFrtless, Solo Vox 3, Reed Romance, Ice Rain 2, St.Power, Oct.JP +Saw, SH-2 Lead, Jazz Slap, OverdriveGt2, Applause.</p> +<p>Reed Romance and SH-2 Lead are from the special 2 set, therefore +cannot be used by the SD-20 MIDI File Converter. They are substituted by +Violin 2 vib and Warm SynHorn automatically. A single SD-80 system +exclusive DT1 message is used to change the patch volume of SH-2 +Lead.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -464,35 +914,134 @@ YOSEMITE.MID by Passport Designs, arranged for SD-80 (Native Mode) </tr> </tbody></table> </div> -<p>Used instruments: Enh.Nylon o, Ocarina vib, St.Slow Str2, PhaseFrtless, Celtic Ens, St.Standard, Soft60’Organ, Pre Bass, St.BritePno.</p> -<p>St.BritePno is a custom patch. It’s selected using system exclusive messages generated by SD-80’s bulk dump feature. Enh.Nylon o, Celtic Ens, Pre Bass are not available in the SD-20 Converter.</p> -<p>The output from the converter is significantly louder than SD-80’s digital output. I normalized all recordings before uploading them. Despite the lack of a lot of features and patches, the converter actually sounded exceptionally good, and exceeded my expectation by quite a large margin.</p> -<p>The converter is not a software implementation of SD-20’s internals. There’s misinformation out there claiming so, but that’s simply not the case. Roland explicitly disclosed this in the readme file of the converter.</p> +<p>Used instruments: Enh.Nylon o, Ocarina vib, St.Slow Str2, +PhaseFrtless, Celtic Ens, St.Standard, Soft60’Organ, Pre Bass, +St.BritePno.</p> +<p>St.BritePno is a custom patch. It’s selected using system exclusive +messages generated by SD-80’s bulk dump feature. Enh.Nylon o, Celtic +Ens, Pre Bass are not available in the SD-20 Converter.</p> +<p>The output from the converter is significantly louder than SD-80’s +digital output. I normalized all recordings before uploading them. +Despite the lack of a lot of features and patches, the converter +actually sounded exceptionally good, and exceeded my expectation by +quite a large margin.</p> +<p>The converter is not a software implementation of SD-20’s internals. +There’s misinformation out there claiming so, but that’s simply not the +case. Roland explicitly disclosed this in the readme file of the +converter.</p> <h4 id="tocanch12" class="tvis">FrankenTTS-1</h4> -<p>Something smells fishy instantly when I got this converter. That file name “param.dat” looks really familiar. If you have used any of Roland’s HQ software synthesizer products from the early 2000s <a id="n10" href="#note10" class="note">[10]</a>, you might feel the same. They all use this file to store their samples and patch data.</p> -<p>One natural thing to do is to replace the param.dat file of these plugins with the one supplied with the converter. The result are as follows:</p> +<p>Something smells fishy instantly when I got this converter. That file +name “param.dat” looks really familiar. If you have used any of Roland’s +HQ software synthesizer products from the early 2000s +<a id="n10" href="#note10" class="note">[10]</a>, you might feel the same. They all use this file to +store their samples and patch data.</p> +<p>One natural thing to do is to replace the param.dat file of these +plugins with the one supplied with the converter. The result are as +follows:</p> <ul> <li>HQ-OR/HQ-QT refuses to load at all after the swap.</li> -<li>HQ-GM2 loads correctly. Instrument names changes to the names from SD-20’s Classical set (for example, 1:0 changes from Piano 1 st. to Piano 1w). Only instruments from the Classical set are available. No NRPN messages can change the instrument set. The sound is pretty much identical to that from the converter.</li> -<li>GrooveSynth (P5antom) also loads correctly. Besides all instruments from the Classical set, a couple of instruments from the Contemporary set and Solo set are also available, but there’s no obvious pattern there. All rhythm sets are available in the Franken-GrooveSynth.</li> +<li>HQ-GM2 loads correctly. Instrument names changes to the names from +SD-20’s Classical set (for example, 1:0 changes from Piano 1 st. to +Piano 1w). Only instruments from the Classical set are available. No +NRPN messages can change the instrument set. The sound is pretty much +identical to that from the converter.</li> +<li>GrooveSynth (P5antom) also loads correctly. Besides all instruments +from the Classical set, a couple of instruments from the Contemporary +set and Solo set are also available, but there’s no obvious pattern +there. All rhythm sets are available in the Franken-GrooveSynth.</li> </ul> -<p>This reveals that the synthesizer engine is identical to that used by these HQ software synthesizers, proving the claim that this converter is a software implementation of SD-20 wrong again.</p> -<p>There’s not much information about the structure of this “param.dat” file online, nor could I figure it out myself (I’m not a huge fan of doing such work). However this interchangeablility is somewhat delighting.</p> +<p>This reveals that the synthesizer engine is identical to that used by +these HQ software synthesizers, proving the claim that this converter is +a software implementation of SD-20 wrong again.</p> +<p>There’s not much information about the structure of this “param.dat” +file online, nor could I figure it out myself (I’m not a huge fan of +doing such work). However this interchangeablility is somewhat +delighting.</p> <h4 id="tocanch13" class="tvis">Other observations</h4> -<p>The executable of the converter is a mere ~500KiB and doesn’t seem to use an executable packer. This suggests the “HQ” engine couldn’t be super complex.</p> -<p>The executable contains references to “Automation”, “User Rhythm” and such. Apparently they still left some code from the plugin version of the HQ engine in this converter.</p> -<p>I think I found the entry to the function where param.dat is loaded (0x004228e0). No idea where to go from there though.</p> +<p>The executable of the converter is a mere ~500KiB and doesn’t seem to +use an executable packer. This suggests the “HQ” engine couldn’t be +super complex.</p> +<p>The executable contains references to “Automation”, “User Rhythm” and +such. Apparently they still left some code from the plugin version of +the HQ engine in this converter.</p> +<p>I think I found the entry to the function where param.dat is loaded +(0x004228e0). No idea where to go from there though.</p> <h4 id="tocanch14" class="tvis">So… is this it?</h4> -<p>Nah, we should not depend on a piece of proprietary junk for the preservation of anything.</p> -<p>Maybe some wizards could find a way to hack the plugins and make all instruments available in TTS-1 or something. But that doesn’t really work as a way to preserve the synth if the binary code it depends on could stop working at an arbitrary point of time in the future, does it?</p> +<p>Nah, we should not depend on a piece of proprietary junk for the +preservation of anything.</p> +<p>Maybe some wizards could find a way to hack the plugins and make all +instruments available in TTS-1 or something. But that doesn’t really +work as a way to preserve the synth if the binary code it depends on +could stop working at an arbitrary point of time in the future, does +it?</p> <h3 id="tocanch15" class="tvis">Roland Cloud</h3> -<p>Roland has been pushing their subscription service “Roland Cloud” since 2018. When it first came out there was no plugin of my interest. The deal breaker for me back then was there was no permanent licensing option. If you know me, I’m strongly opposed to the subscription model used for software products.</p> -<p>Starting from May 2020 though, Roland started offering “lifetime keys”, which now puts this service within my radar. I took the ultimate tier trial and installed every piece of plugin replicating SRX boards and the XV-5080, as well as the then-new “Zenology” synth. I’ve got mixed results.</p> -<p>The software aspect is okay. It’s much better than SoundCanvas VA I’ve used years ago, which has glitchy TVA and TVF and was never fixed. The user interface scales perfectly on high DPI screens. Editing experience of the SRX/XV plugins is basically the same as the editors for later Roland PCM synths (such as the SonicCell and the Integra-7) – that is, much better than the original XV or SD-80 editor. These plugins still have terrible performance as most previous Roland software synths do (each instance needs plenty of processing power – if you use a computer that predates the release of these plugins, the performance will probably suffer).</p> -<p>The sound is … fine? Didn’t give me the same astonishment when I heard a real XV-5080 on YouTube though (I thought “no way this thing only has 32 MiB of sample content!”). For most patches, they sound “close enough” to an actual XV-5080, despite a handful of caveats. The synth engine do behave nearly identical to actual XV-based synths, at least according to my tests. The XV-5080 plugin is especially underwhelming, considering the original XV-5080 is expandable and can also load external samples. If only the XV-5080 plugin could load samples and patches from other SRX plugins installed, it would have been a lot better (although this is solved by Zenology, it has its own issues). The MFX uses a different set of effect types from the original XV-5080 and SD-80: they are modeled after synths after the Fantom-S era). However I’d say the effects bearing the same name as XV effects do sound largely the same.</p> -<p>The executables contain a resource folder named “WROM”, and it contains the wave ROMs used by the plugins. They are all exactly 32 MiB. The wave ROM files contains a similar 32-byte header to dumps of actual wave ROM of earlier Roland PCM synths (see the JD-800 wave ROM dump from Edward of dtech.lv).</p> -<p>I do have some major complaints though. Each executable contains a copy of the wave ROMs. If you choose to install all plugin formats, that will install 4 copy of exactly the same wave ROM on your computer. Also it’s impossible to combine the sounds of different SRX boards. Most samples originated from Spectrasonics are missing from the SRX plugins but are reincluded in the EXZ expansions which can be used in Zenology, indicating a copyright dispute between the two companies that was resolved later <a id="n11" href="#note11" class="note">[11]</a>. These problems can be partially solved if you use the newer Zenology plugin instead. But Zenology is riddled with its own issues. It uses a nearly entirely new set of MFX (identical to the MFX from their 2019 Fantom-6/7/8 workstations and other “ZEN-CORE” based products), and completely lacks reverb effects. Effects that have the same name in Zenology and XV-based synths doesn’t necessarily behave the same. And Zenology still can’t load samples from different sample groups to left and right channels of a single voice. I know it’s a thing in the original XV, but since it’s a software reimplementation, they don’t have to stick to the same restrictions do they? Also, why are all these plugins monotimbral? If your answer is “just use multiple instances”, I would remind you that these are Roland software synths, and they don’t perform well if you add multiple to your virtual rack…</p> -<p>Recreating patches of the SD-80 using these plugins does seem to be possible, and there are already plenty of people doing that. See the section <a href="#tocanch32">“SD-80’s sound content”</a> for details. However it does still rely on proprietary Roland software products (which, if they want to, can cease the support at any time), requires pricy licenses, and on top of all that, a crappy authenticating system.</p> +<p>Roland has been pushing their subscription service “Roland Cloud” +since 2018. When it first came out there was no plugin of my interest. +The deal breaker for me back then was there was no permanent licensing +option. If you know me, I’m strongly opposed to the subscription model +used for software products.</p> +<p>Starting from May 2020 though, Roland started offering “lifetime +keys”, which now puts this service within my radar. I took the ultimate +tier trial and installed every piece of plugin replicating SRX boards +and the XV-5080, as well as the then-new “Zenology” synth. I’ve got +mixed results.</p> +<p>The software aspect is okay. It’s much better than SoundCanvas VA +I’ve used years ago, which has glitchy TVA and TVF and was never fixed. +The user interface scales perfectly on high DPI screens. Editing +experience of the SRX/XV plugins is basically the same as the editors +for later Roland PCM synths (such as the SonicCell and the Integra-7) – +that is, much better than the original XV or SD-80 editor. These plugins +still have terrible performance as most previous Roland software synths +do (each instance needs plenty of processing power – if you use a +computer that predates the release of these plugins, the performance +will probably suffer).</p> +<p>The sound is … fine? Didn’t give me the same astonishment when I +heard a real XV-5080 on YouTube though (I thought “no way this thing +only has 32 MiB of sample content!”). For most patches, they sound +“close enough” to an actual XV-5080, despite a handful of caveats. The +synth engine do behave nearly identical to actual XV-based synths, at +least according to my tests. The XV-5080 plugin is especially +underwhelming, considering the original XV-5080 is expandable and can +also load external samples. If only the XV-5080 plugin could load +samples and patches from other SRX plugins installed, it would have been +a lot better (although this is solved by Zenology, it has its own +issues). The MFX uses a different set of effect types from the original +XV-5080 and SD-80: they are modeled after synths after the Fantom-S +era). However I’d say the effects bearing the same name as XV effects do +sound largely the same.</p> +<p>The executables contain a resource folder named “WROM”, and it +contains the wave ROMs used by the plugins. They are all exactly 32 MiB. +The wave ROM files contains a similar 32-byte header to dumps of actual +wave ROM of earlier Roland PCM synths (see the JD-800 wave ROM dump from +Edward of dtech.lv).</p> +<p>I do have some major complaints though. Each executable contains a +copy of the wave ROMs. If you choose to install all plugin formats, that +will install 4 copy of exactly the same wave ROM on your computer. Also +it’s impossible to combine the sounds of different SRX boards. Most +samples originated from Spectrasonics are missing from the SRX plugins +but are reincluded in the EXZ expansions which can be used in Zenology, +indicating a copyright dispute between the two companies that was +resolved later <a id="n11" href="#note11" class="note">[11]</a>. These problems +can be partially solved if you use the newer Zenology plugin instead. +But Zenology is riddled with its own issues. It uses a nearly entirely +new set of MFX (identical to the MFX from their 2019 Fantom-6/7/8 +workstations and other “ZEN-CORE” based products), and completely lacks +reverb effects. Effects that have the same name in Zenology and XV-based +synths doesn’t necessarily behave the same. And Zenology still can’t +load samples from different sample groups to left and right channels of +a single voice. I know it’s a thing in the original XV, but since it’s a +software reimplementation, they don’t have to stick to the same +restrictions do they? Also, why are all these plugins monotimbral? If +your answer is “just use multiple instances”, I would remind you that +these are Roland software synths, and they don’t perform well if you add +multiple to your virtual rack…</p> +<p>Recreating patches of the SD-80 using these plugins does seem to be +possible, and there are already plenty of people doing that. See the +section <a href="#tocanch32">“SD-80’s sound content”</a> for details. +However it does still rely on proprietary Roland software products +(which, if they want to, can cease the support at any time), requires +pricy licenses, and on top of all that, a crappy authenticating +system.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -528,9 +1077,14 @@ SD-80 using patch parameters pulled from XV-5080 </tr> </tbody></table> </div> -<h2 id="tocanch16" class="tvis">A History lesson from someone who barely knows anything about it</h2> -<p>AKA a short history of Roland’s sample-based synths from someone who has used almost none of them.</p> -<p>Below is a comparison chart of selected sample-based synths from Roland using information available from their manuals (mostly sysex address mapping in the MIDI implementation) and service manuals. In a few occasions sources from the Internet are used as well.</p> +<h2 id="tocanch16" class="tvis">A +History lesson from someone who barely knows anything about it</h2> +<p>AKA a short history of Roland’s sample-based synths from someone who +has used almost none of them.</p> +<p>Below is a comparison chart of selected sample-based synths from +Roland using information available from their manuals (mostly sysex +address mapping in the MIDI implementation) and service manuals. In a +few occasions sources from the Internet are used as well.</p> <div class="collapse" data-caption="More detailed comparison of various Roland's PCM based sound modules"> <p>Chip information on following modules are from actual units:</p> <ul> @@ -615,7 +1169,8 @@ MB87731A (EP) + MB87424A (TVF) 2 * TC6088AF (CSP), 4 Mbit RAM </td> <td> -3 * 16 Mbit = 6 MiB, expandable w/ SL-JD80, SO-PCM1, PN-JV80 and SR-JV80 boards +3 * 16 Mbit = 6 MiB, expandable w/ SL-JD80, SO-PCM1, PN-JV80 and SR-JV80 +boards </td> <td> H8/570 @@ -630,7 +1185,8 @@ H8/570 128i + 2r + 32p </td> <td> -JD Multi (EQ + Dist + Phaser + Spectrum + Enhancer + Chorus + Delay + Reverb) +JD Multi (EQ + Dist + Phaser + Spectrum + Enhancer + Chorus + Delay + +Reverb) </td> </tr> <tr> @@ -702,7 +1258,8 @@ TC6116AF (GP4) Integrated, 256 Kbit RAM </td> <td> -2 * 16 Mbit = 4 MiB, expandable w/ SR-JV80 boards & PN-JV80 / SO-PCM cards +2 * 16 Mbit = 4 MiB, expandable w/ SR-JV80 boards & PN-JV80 / SO-PCM +cards </td> <td> H8/532 @@ -760,7 +1317,8 @@ MBCS30109B (XP) Integrated, 2 * 1 Mbit RAM </td> <td> -4 * 16 Mbit = 8 MiB, expandable w/ SR-JV80 boards & PN-JV80 / SO-PCM cards +4 * 16 Mbit = 8 MiB, expandable w/ SR-JV80 boards & PN-JV80 / SO-PCM +cards </td> <td> HD6477034, SH7034 (SH1) @@ -1108,7 +1666,8 @@ XV-5080 Integrated, 2 * 16 Mbit RAM </td> <td> -2 * 128 Mbit = 32 MiB (expandable w/ SRX & SR-JV80 boards and EDO DRAM up to 128 MiB) +2 * 128 Mbit = 32 MiB (expandable w/ SRX & SR-JV80 boards and EDO +DRAM up to 128 MiB) </td> <td> HD6437042A13F, SH7042 (SH2) @@ -1195,7 +1754,8 @@ TC223C660CF-503, RA08-503 (XV), 4 Mbit RAM TC223C080AF-101, RA0A-101 (ESP4), 16 Mbit RAM </td> <td> -2 * 128 Mbit = 32 MiB (w/ 2 * 128 Mbit = 32 MiB sampling RAM, expandable up to 288 MiB, plus SRX boards) +2 * 128 Mbit = 32 MiB (w/ 2 * 128 Mbit = 32 MiB sampling RAM, expandable +up to 288 MiB, plus SRX boards) </td> <td> HD6417706, SH7706 (SH3) @@ -1224,7 +1784,8 @@ T6TV2TBG-0002 (WX) Integrated, 64 Mbit RAM </td> <td> -4 * 128 Mbit = 64 MiB (w/ 2 * 64 Mbit = 16 MiB sampling RAM, expandable up to 528 MiB, plus SRX boards) +4 * 128 Mbit = 64 MiB (w/ 2 * 64 Mbit = 16 MiB sampling RAM, expandable +up to 528 MiB, plus SRX boards) </td> <td> HD6417706, SH7706 (SH3) @@ -1253,7 +1814,8 @@ T6TV2TBG-0002 (WX) 2 * T6TZ3AFG-0001 (WSP) w/ 64 Mbit RAM each + WX Integrated, 64 Mbit RAM </td> <td> -2 * 512 Mbit = 128 MiB (w/ 2 * 128Mbit = 32MiB sampling RAM, expandable upto 544 MiB, plus ARX boards (external SSC synthesis)) +2 * 512 Mbit = 128 MiB (w/ 2 * 128Mbit = 32MiB sampling RAM, expandable +upto 544 MiB, plus ARX boards (external SSC synthesis)) </td> <td> SH7785 (SH4A) @@ -1268,7 +1830,8 @@ SH7785 (SH4A) 1920i + 73r + 8p </td> <td> -Reverb, Chorus, PFX (16 slots, one per channel, 76 types), MFX (2 slots, 78 types), Mastering & Input Effects +Reverb, Chorus, PFX (16 slots, one per channel, 76 types), MFX (2 slots, +78 types), Mastering & Input Effects </td> </tr> <tr> @@ -1294,120 +1857,391 @@ R8A02021ABG (SSC7), SH4? 128 </td> <td> -6030i + 258r + 64p <!--64 "Studio Sets" (performances), SuperNATURAL (256 Ac, 1109 Sy, 26 Dr) + XV-5080 PCM (896i, 14d) + GM2 (256i, 9d) + ExSN1-6 (17i, 17i, 50i, 12i, 12i, 7d) + SRX01-12 (41i + 79d, 50i, 128i + 12d, 128i, 312i + 34d, 449i + 5d, 475i + 11d, 448i + 21d, 414i + 12d, 100i, 42i, 50i) + HQGM2 (256i, 9d) + HQPCM (512i, 19d)--> +6030i + 258r + 64p +<!--64 "Studio Sets" (performances), SuperNATURAL (256 Ac, 1109 Sy, 26 Dr) + XV-5080 PCM (896i, 14d) + GM2 (256i, 9d) + ExSN1-6 (17i, 17i, 50i, 12i, 12i, 7d) + SRX01-12 (41i + 79d, 50i, 128i + 12d, 128i, 312i + 34d, 449i + 5d, 475i + 11d, 448i + 21d, 414i + 12d, 100i, 42i, 50i) + HQGM2 (256i, 9d) + HQPCM (512i, 19d)--> </td> <td> -Reverb, Chorus, MFX (16 slots, 67 types), EQ, compressor (drum part), Surround, Mastering (EQ) +Reverb, Chorus, MFX (16 slots, 67 types), EQ, compressor (drum part), +Surround, Mastering (EQ) </td> </tr> </tbody></table> </div> -<p>The following section summarizes generation-over-generation improvements of the synth engine noticed by me reading the manuals. There is a little bit of technical assessment of the chips, however most of it is <strong>not</strong> based on analysis of the actual chip, instead it’s based on analysis of the most capable synth model using that chip. Some of the features might be added with newer version of system software (such as the multisampling feature on XV-based synths mentioned below) rather than improvements on the actual synth chip. It’s in no way, shape or form complete. A lot of synthesizer keyboard models are not listed. It could be way too technical for some readers. If that’s the case, feel free to skip this section.</p> +<p>The following section summarizes generation-over-generation +improvements of the synth engine noticed by me reading the manuals. +There is a little bit of technical assessment of the chips, however most +of it is <strong>not</strong> based on analysis of the actual chip, +instead it’s based on analysis of the most capable synth model using +that chip. Some of the features might be added with newer version of +system software (such as the multisampling feature on XV-based synths +mentioned below) rather than improvements on the actual synth chip. It’s +in no way, shape or form complete. A lot of synthesizer keyboard models +are not listed. It could be way too technical for some readers. If +that’s the case, feel free to skip this section.</p> <h3 id="tocanch17" class="tvis">LA</h3> -<p>Not strictly a PCM synth. Only uses PCM for the attack phase of the sound. Already showing Roland’s base designs for later PCM synths: 4 “partials” (this term is from 80s Roland samplers, and was referred to as either voices or tones in later products) for each patch. Each partial has its “timbre”, which consists of a WG (“wave generator”), 5-stage envelope generators for filters and amplifiers (which in later PCM synths were reduced to 4-stage), and a single LFO for mod wheel. Filters are always low-pass. Poor panning resolution (15 steps instead of GM’s 128). Rhythm patches reference to individual “timbres” on each key. Usually paired with external reverb and chorus processing chips. Up to 32 polyphony.</p> -<p>Used in MT-32, CM-64, CM-32L, D-110 (as MB87136A “LA32”, QFP), and D-50 (as MB87136, PGA).</p> -<p>Due to the popularity of MT-32, which is supported by a whole bunch of DOS games, emulation of this engine is pretty well-developed already (see the aforementioned Munt project).</p> -<h3 id="tocanch18" class="tvis">(Unnamed synth engine in U-110)</h3> -<p>An early (late-1980s) incarnation of Roland’s PCM only synth. No filters at all. Amp env reduced to 3 stages (?). The synth structure looks more closely related to that of LA rather than later Roland PCM synths. 31 polyphony. The synth consists of two chips: MB87419 and MB87420. The former seems to act as a controller, while the latter does the actual sound generation. There’s an additional chip to handle output selection. Also relies on external chips for effects.</p> -<p>Interestingly, MAME has a partial implementation of this synth engine (src/devices/sound/rolandpcm.cpp).</p> +<p>Not strictly a PCM synth. Only uses PCM for the attack phase of the +sound. Already showing Roland’s base designs for later PCM synths: 4 +“partials” (this term is from 80s Roland samplers, and was referred to +as either voices or tones in later products) for each patch. Each +partial has its “timbre”, which consists of a WG (“wave generator”), +5-stage envelope generators for filters and amplifiers (which in later +PCM synths were reduced to 4-stage), and a single LFO for mod wheel. +Filters are always low-pass. Poor panning resolution (15 steps instead +of GM’s 128). Rhythm patches reference to individual “timbres” on each +key. Usually paired with external reverb and chorus processing chips. Up +to 32 polyphony.</p> +<p>Used in MT-32, CM-64, CM-32L, D-110 (as MB87136A “LA32”, QFP), and +D-50 (as MB87136, PGA).</p> +<p>Due to the popularity of MT-32, which is supported by a whole bunch +of DOS games, emulation of this engine is pretty well-developed already +(see the aforementioned Munt project).</p> +<h3 id="tocanch18" class="tvis">(Unnamed synth engine in +U-110)</h3> +<p>An early (late-1980s) incarnation of Roland’s PCM only synth. No +filters at all. Amp env reduced to 3 stages (?). The synth structure +looks more closely related to that of LA rather than later Roland PCM +synths. 31 polyphony. The synth consists of two chips: MB87419 and +MB87420. The former seems to act as a controller, while the latter does +the actual sound generation. There’s an additional chip to handle output +selection. Also relies on external chips for effects.</p> +<p>Interestingly, MAME has a partial implementation of this synth engine +(src/devices/sound/rolandpcm.cpp).</p> <p>Found in U-110, U-220, CM-32P and various R-8 variants.</p> <h3 id="tocanch19" class="tvis">EP</h3> -<p>Early-1990s PCM synth. Has filters but requires an external TVF chip.</p> -<p>The models using this engine seems to have roughly the same feature set as GP-based models. However they lack a lot of controls for rhythm patches. Some models come with a much more powerful effects engine (which is external to the EP chip).</p> +<p>Early-1990s PCM synth. Has filters but requires an external TVF +chip.</p> +<p>The models using this engine seems to have roughly the same feature +set as GP-based models. However they lack a lot of controls for rhythm +patches. Some models come with a much more powerful effects engine +(which is external to the EP chip).</p> <p>Used in HP-3700/2700 (as MB87731), and JD-800/990 (as MB87731A).</p> <h3 id="tocanch20" class="tvis">GP</h3> -<p>Uses 4-stage envelope generators for filter and amplitude. Has two filter modes (LPF and HPF). Individual tones can be delayed after the note is triggered. Each tone has 2 independent LFOs. Has a rudimentary modulation matrix (with fixed modulation sources). Reverb and chorus effects are integrated in the chip. Most parameters now accepts values from 0 to 127 (rather than 0 to 100 in LA-based units). Has FxM (frequency modulation) capability. More parameters can be modulated by key follow or velocity, which now also supports velocity curves and sensitivity offsets. Up to 28 polyphony on GP4 (24 on the original GP).</p> +<p>Uses 4-stage envelope generators for filter and amplitude. Has two +filter modes (LPF and HPF). Individual tones can be delayed after the +note is triggered. Each tone has 2 independent LFOs. Has a rudimentary +modulation matrix (with fixed modulation sources). Reverb and chorus +effects are integrated in the chip. Most parameters now accepts values +from 0 to 127 (rather than 0 to 100 in LA-based units). Has FxM +(frequency modulation) capability. More parameters can be modulated by +key follow or velocity, which now also supports velocity curves and +sensitivity offsets. Up to 28 polyphony on GP4 (24 on the original +GP).</p> <p>The original GP (TC24SC201AF-002) is used in JV-80 and SC-55.</p> -<p>A later variant “GP4” (TC6116AF) is used in JV-880, SC-55mkII and MC-303. It contains an additional gate array as LCD controller and handles extra IO.</p> +<p>A later variant “GP4” (TC6116AF) is used in JV-880, SC-55mkII and +MC-303. It contains an additional gate array as LCD controller and +handles extra IO.</p> <h3 id="tocanch21" class="tvis">XP</h3> <p>This iteration has a lot of variants.</p> <h4 id="tocanch22" class="tvis">Original XP</h4> -<p>Two additional filter modes (BPF and PKG). Modulation matrix has partially configurable modulation sources. Introduced random panning and alternate panning. Key ranges of tones can be limited. Voice priority (which note to steal when a new note is played if polyphony is maxed) can be adjusted. Has integrated effects processor with 40 available effect types. Up to 64 polyphony. This chip seems to have the facilities for pairing two of them together, but none of the production rack units make use of this feature as far as I know. 24-bit wave address bus for a maximum of 16777216 words (=32 MiB) addressable wave ROM per chip.</p> +<p>Two additional filter modes (BPF and PKG). Modulation matrix has +partially configurable modulation sources. Introduced random panning and +alternate panning. Key ranges of tones can be limited. Voice priority +(which note to steal when a new note is played if polyphony is maxed) +can be adjusted. Has integrated effects processor with 40 available +effect types. Up to 64 polyphony. This chip seems to have the facilities +for pairing two of them together, but none of the production rack units +make use of this feature as far as I know. 24-bit wave address bus for a +maximum of 16777216 words (=32 MiB) addressable wave ROM per chip.</p> <p>Used in JV-1080 (as MBCS30109B), and SC-88 (as MBCS30109).</p> <h4 id="tocanch23" class="tvis">XP2</h4> <p>Seems to be a drop-in replacement of the original XP.</p> -<p>Used in production units of XP-80 (designed with the original XP) and SC-88VL (both as MB87B105PF-G or RHR-2342).</p> +<p>Used in production units of XP-80 (designed with the original XP) and +SC-88VL (both as MB87B105PF-G or RHR-2342).</p> <h4 id="tocanch24" class="tvis">XP3</h4> <p>Seems pin-compatible with the original XP.</p> -<p>Used in JV-2080, SC-88Pro, and JX-305 (as TC170C200AF-005 or RA01-005).</p> +<p>Used in JV-2080, SC-88Pro, and JX-305 (as TC170C200AF-005 or +RA01-005).</p> <h4 id="tocanch25" class="tvis">XP6</h4> -<p>Tones can have different samples on each stereo channel. Two extra filter modes (LPF2 and LPF3). Fully configurable modulation matrix. 63 internal effect types. Up to 64 polyphony. Actual models with two of these chips exist (XV-3080 and SC-8850).</p> -<p>Used in XV-3080, JV-1010, XV-88, SC-8850, SC-8820 and SC-D70 (as TC203C180AF-002 or RA09-002). XV-88, XV-3080 and SC-8850 use a pair of XP6.</p> +<p>Tones can have different samples on each stereo channel. Two extra +filter modes (LPF2 and LPF3). Fully configurable modulation matrix. 63 +internal effect types. Up to 64 polyphony. Actual models with two of +these chips exist (XV-3080 and SC-8850).</p> +<p>Used in XV-3080, JV-1010, XV-88, SC-8850, SC-8820 and SC-D70 (as +TC203C180AF-002 or RA09-002). XV-88, XV-3080 and SC-8850 use a pair of +XP6.</p> <h4 id="tocanch26" class="tvis">XP7</h4> -<p>Cut-down variant used in low cost models. Only the 40 “classical” JV/XP effect types are present. All XP chips <em>before</em> XP7 work at a 32 kHz output sampling rate (24.576 MHz clock input, 768 clock cycles per output sample, or 12 clock cycles per voice). XP7 is also capable of operating at 44.1 kHz with a 33.868 MHz clock input (found in the SD-20 and DR-880).</p> -<p>Used in XV-2020, SD-20, DR-880, and E-09 (as TC203C180AF-003 or RA0C-003).</p> +<p>Cut-down variant used in low cost models. Only the 40 “classical” +JV/XP effect types are present. All XP chips <em>before</em> XP7 work at +a 32 kHz output sampling rate (24.576 MHz clock input, 768 clock cycles +per output sample, or 12 clock cycles per voice). XP7 is also capable of +operating at 44.1 kHz with a 33.868 MHz clock input (found in the SD-20 +and DR-880).</p> +<p>Used in XV-2020, SD-20, DR-880, and E-09 (as TC203C180AF-003 or +RA0C-003).</p> <h3 id="tocanch27" class="tvis">XV</h3> -<p>Mostly the same as XP6, but with COSM effects (guitar/bass amplifiers, speaker & microphone emulation) and two additional effect slots. 90 internal effect types. 3 insertion effect slots (40 of the 90 effect types takes all 3 slots if only one chip is used). Up to 64 polyphony. Has an additional memory controller for sample RAM, enabling dynamic sampling. Can be paired to double the maximum polyphony and improve effects DSP power. 25-bit wave address bus for a maximum of 33554432 words (=64 MiB) addressable wave ROM per chip (all XPs have a 24-bit wave address bus).</p> -<p>Used in XV-5080, XV-5050, SD-90, SD-80, Fantom, Fantom S/S88, MV-8800, and MC-909 (as TC223C660CF-503 or RA08-503). XV-5080, SD-90 and SD-80 use a pair of XV.</p> -<p>XV-5080 seems unique among these models as it has a (software) switch between two master clocks for the XV chip that allows for switching between 44.1 kHz and 48 kHz output. The XV engine in all other models listed above outputs at 44.1 kHz. Twice efficient compared to the XP series, the XV chip needs 6 clock cycles to process each voice, which translate to a input clock of 16.9344 MHz (44.1 kHz output) or 18.432 MHz (48 kHz output).</p> -<p>Earlier models with sampling capability using this chip doesn’t have proper external multisample support until Fantom S/S88, suggesting the multisample support is added with system firmware rather modifications to the synth engine.</p> +<p>Mostly the same as XP6, but with COSM effects (guitar/bass +amplifiers, speaker & microphone emulation) and two additional +effect slots. 90 internal effect types. 3 insertion effect slots (40 of +the 90 effect types takes all 3 slots if only one chip is used). Up to +64 polyphony. Has an additional memory controller for sample RAM, +enabling dynamic sampling. Can be paired to double the maximum polyphony +and improve effects DSP power. 25-bit wave address bus for a maximum of +33554432 words (=64 MiB) addressable wave ROM per chip (all XPs have a +24-bit wave address bus).</p> +<p>Used in XV-5080, XV-5050, SD-90, SD-80, Fantom, Fantom S/S88, +MV-8800, and MC-909 (as TC223C660CF-503 or RA08-503). XV-5080, SD-90 and +SD-80 use a pair of XV.</p> +<p>XV-5080 seems unique among these models as it has a (software) switch +between two master clocks for the XV chip that allows for switching +between 44.1 kHz and 48 kHz output. The XV engine in all other models +listed above outputs at 44.1 kHz. Twice efficient compared to the XP +series, the XV chip needs 6 clock cycles to process each voice, which +translate to a input clock of 16.9344 MHz (44.1 kHz output) or 18.432 +MHz (48 kHz output).</p> +<p>Earlier models with sampling capability using this chip doesn’t have +proper external multisample support until Fantom S/S88, suggesting the +multisample support is added with system firmware rather modifications +to the synth engine.</p> <h3 id="tocanch28" class="tvis">WX</h3> -<p>Capability wise, WX seems to be the equivalent of dual XV with the external effects chip used in Fantom S/S88 (TC223C080AF-101, RA0A-101) integrated. 78 internal effect types plus mastering + input effects. Also added proper multisample support for external samples, which the XV-5080 lacks. <a id="n15" href="#note15" class="note">[15]</a> Up to 128 polyphony. 25-bit wave address bus for a maximum of 33554432 words (=64 MiB) addressable wave ROM per chip. Wave RAM on general data bus instead of wave bus. WX chip is only seen operating at a 44.1 kHz output, and uses a input clock of 16.9344 MHz (3 clock cycles per voice).</p> -<p>Found in the Fantom-X series and Fantom-G series, as well as MC-808. (SonicCell and SD-50 are also likely equipped with this chip, but I’m not 100% sure.)</p> +<p>Capability wise, WX seems to be the equivalent of dual XV with the +external effects chip used in Fantom S/S88 (TC223C080AF-101, RA0A-101) +integrated. 78 internal effect types plus mastering + input effects. +Also added proper multisample support for external samples, which the +XV-5080 lacks. <a id="n15" href="#note15" class="note">[15]</a> Up to 128 polyphony. 25-bit +wave address bus for a maximum of 33554432 words (=64 MiB) addressable +wave ROM per chip. Wave RAM on general data bus instead of wave bus. WX +chip is only seen operating at a 44.1 kHz output, and uses a input clock +of 16.9344 MHz (3 clock cycles per voice).</p> +<p>Found in the Fantom-X series and Fantom-G series, as well as MC-808. +(SonicCell and SD-50 are also likely equipped with this chip, but I’m +not 100% sure.)</p> <h3 id="tocanch29" class="tvis">Beyond WX</h3> -<p>From this point on the service manuals from Roland have become less useful. They stopped listing the ICs in their parts list. However the block diagram and schematics remain.</p> -<p>Roland introduced the so-called “SuperNATURAL” sounds with their Fantom-G series, together with its new expansion board format (ARX). These boards has a CPU built on it (the same SSC7 CPU used in Integra-7). The CPU is connected to a set of RAM named “Effects RAM” in Roland service manuals. Fantom-G by itself doesn’t appear to have any “SuperNATURAL” sounds preloaded, and these new sounds clearly breaks some of the limitations of the old synth engines. This leads to my suspicion that the ARX boards have self-contained synth engines on board, and the new “SuperNATURAL” engine is either software based, or the SSC7 chip has some sort of extra bits that doesn’t belong to the CPU (that is, an integrated ASIC DSP block). The SSC/SSC7 chip is seen on all ARX boards, as well as the Integra-7.</p> -<p>Along with this new CPU thing, there are new effect processors/DSPs: WSP and ESC2. WSP is found in a few relatively earlier (2009-ish) models, while ESC2 is appears in almost all post 2010 Roland synths (Integra-7, probably all Boutique models, and the latest Fantom-6/7/8 series). A single ESC2 chip is able to provide 16 individual effect slots in the Integra-7. However sometimes two of these chips can be seen in some of the Boutique units. It also has a JTAG interface, and handles USB connectivity in the Integra-7, leading to the suspicion that it also has a microcontroller built-in.</p> -<h2 id="tocanch30" class="tvis">Role played by the CPU in sound generation</h2> -<p>When I started writing this post, my thoughts were the vast majority of the synth functionality is contained in the synth chip. In other words, the synth chip provides a very high level of abstraction, and the CPU only needs to pass processed voice events to the synth chip. In retrospect this is not plausible, due to the following facts:</p> +<p>From this point on the service manuals from Roland have become less +useful. They stopped listing the ICs in their parts list. However the +block diagram and schematics remain.</p> +<p>Roland introduced the so-called “SuperNATURAL” sounds with their +Fantom-G series, together with its new expansion board format (ARX). +These boards has a CPU built on it (the same SSC7 CPU used in +Integra-7). The CPU is connected to a set of RAM named “Effects RAM” in +Roland service manuals. Fantom-G by itself doesn’t appear to have any +“SuperNATURAL” sounds preloaded, and these new sounds clearly breaks +some of the limitations of the old synth engines. This leads to my +suspicion that the ARX boards have self-contained synth engines on +board, and the new “SuperNATURAL” engine is either software based, or +the SSC7 chip has some sort of extra bits that doesn’t belong to the CPU +(that is, an integrated ASIC DSP block). The SSC/SSC7 chip is seen on +all ARX boards, as well as the Integra-7.</p> +<p>Along with this new CPU thing, there are new effect processors/DSPs: +WSP and ESC2. WSP is found in a few relatively earlier (2009-ish) +models, while ESC2 is appears in almost all post 2010 Roland synths +(Integra-7, probably all Boutique models, and the latest Fantom-6/7/8 +series). A single ESC2 chip is able to provide 16 individual effect +slots in the Integra-7. However sometimes two of these chips can be seen +in some of the Boutique units. It also has a JTAG interface, and handles +USB connectivity in the Integra-7, leading to the suspicion that it also +has a microcontroller built-in.</p> +<h2 id="tocanch30" class="tvis">Role played by the +CPU in sound generation</h2> +<p>When I started writing this post, my thoughts were the vast majority +of the synth functionality is contained in the synth chip. In other +words, the synth chip provides a very high level of abstraction, and the +CPU only needs to pass processed voice events to the synth chip. In +retrospect this is not plausible, due to the following facts:</p> <ul> -<li>Models with the same chips sometimes have significant feature disparity (Fantom-S with external multisamples which is not found on any other XV-based models).</li> -<li>Only the CPU has direct access to the memory that stores patch parameters.</li> -<li>There’s no reason for such a powererful CPU in some low-end models.</li> +<li>Models with the same chips sometimes have significant feature +disparity (Fantom-S with external multisamples which is not found on any +other XV-based models).</li> +<li>Only the CPU has direct access to the memory that stores patch +parameters.</li> +<li>There’s no reason for such a powererful CPU in some low-end +models.</li> </ul> <p>My current hypothesis is the CPU handles:</p> <ul> -<li>control matrix mapping, preprocessing of some parameters (velocity curves, for example)</li> +<li>control matrix mapping, preprocessing of some parameters (velocity +curves, for example)</li> <li>voice (individual tone) allocation and parameter specification</li> -<li>effect and output routing configuration (actual routing happens in the synth chip/DSP obviously)</li> +<li>effect and output routing configuration (actual routing happens in +the synth chip/DSP obviously)</li> <li>certain LFOs (maybe? <a id="n16" href="#note16" class="note">[16]</a>). Envelopes (even less likely).</li> </ul> -<p>This means the synth chip could contain basic blocks for various subsystems (sample playback, modulation, effect processing, etc). Routing among these blocks is controlled by the CPU. If you are somewhat familiar with hardware accelerated rasterization in computer graphics, you may find this architecture has resemblance to the old fixed function graphics pipeline.</p> +<p>This means the synth chip could contain basic blocks for various +subsystems (sample playback, modulation, effect processing, etc). +Routing among these blocks is controlled by the CPU. If you are somewhat +familiar with hardware accelerated rasterization in computer graphics, +you may find this architecture has resemblance to the old fixed function +graphics pipeline.</p> <h2 id="tocanch31" class="tvis">Other Curious Stuff</h2> <h3 id="tocanch32" class="tvis">SD-80 is an XV-5080 …</h3> -<p>… locked into performance mode and with samples cherry-picked by Roland?</p> -<p>Indeed, the address mapping <a id="n17" href="#note17" class="note">[17]</a> for the SD-80 is almost fully compatible with that of XV-5080. Even a lot of parameters that make no sense for the SD-80 are preserved: SD-80 has a parameter to select which wave expansion board to use, wave groups (which the SD-80 only has one), as well as parameters for “multi-partial” patches, which on the XV-5080 is a way to put together patches that use samples loaded into the RAM. Only the first one has its description changed to “reserved” in the documentation. The SD-80 doesn’t have any wave expansion board slots hidden inside, nor does it have support for external sample loading.</p> -<p>Of course from the form factor side of things, the SD-80 looks more like a cut-down version of XV-5050 which is a full 1U rack unit while the SD-80 has a 3/4 rack design. However the SD-80 does retain XV-5080’s 128 polyphony and dual XV guts.</p> -<p>What is called “Performance” in XV-5080’s address map is called “Multitimbre” in SD-80’s address map. They have the exact same content inside (well, not really exact – SD-80 has quite a few extra parameters in the “Multitimbre Common” section, mainly to expose some GM2 parameters and parameters that earlier SoundCanvases had in their address maps). On the XV-5080, you can save the performance to one of its 64 performance memory slots. Configuration of all 32 parts of the synthesizer is restored from the save slot when a performance is loaded. Just like the XV-5080, the SD-80 has a name assigned to its “Multitimbre”, which is set to “Native Mode” upon entering its native mode. But there are no memory slots for “multitimbres” in the SD-80, nor is the name of multitimbre shown anywhere (either on the LCD screen, or in the SD-80 Editor), rendering this name useless. This name is not read-only. You can change it as you wish using system exclusive messages, and is preserved until the next native mode reset message is received.</p> -<p>Since the SD-80 is straight up the same when compared to the XV-5080 in terms of synthesizer engine, and also has extremely similar MIDI implementation <a id="n18" href="#note18" class="note">[18]</a>, the SD-80 can be seen as a XV-5080 with locked-down samples. What the StudioCanvas series does improve over its SoundCanvas predecessors, is its editability in native mode, which is brought on par with its professional counterparts and allow the user take full control of the sound for the first time <a id="n19" href="#note19" class="note">[19]</a>. This is a huge step forward from the lame set of a few parameters offered by earlier GS models. However there is also stuff found in earlier models that’s no longer available in the StudioCanvas, which we are going to touch on in a moment.</p> +<p>… locked into performance mode and with samples cherry-picked by +Roland?</p> +<p>Indeed, the address mapping <a id="n17" href="#note17" class="note">[17]</a> for the SD-80 is almost +fully compatible with that of XV-5080. Even a lot of parameters that +make no sense for the SD-80 are preserved: SD-80 has a parameter to +select which wave expansion board to use, wave groups (which the SD-80 +only has one), as well as parameters for “multi-partial” patches, which +on the XV-5080 is a way to put together patches that use samples loaded +into the RAM. Only the first one has its description changed to +“reserved” in the documentation. The SD-80 doesn’t have any wave +expansion board slots hidden inside, nor does it have support for +external sample loading.</p> +<p>Of course from the form factor side of things, the SD-80 looks more +like a cut-down version of XV-5050 which is a full 1U rack unit while +the SD-80 has a 3/4 rack design. However the SD-80 does retain XV-5080’s +128 polyphony and dual XV guts.</p> +<p>What is called “Performance” in XV-5080’s address map is called +“Multitimbre” in SD-80’s address map. They have the exact same content +inside (well, not really exact – SD-80 has quite a few extra parameters +in the “Multitimbre Common” section, mainly to expose some GM2 +parameters and parameters that earlier SoundCanvases had in their +address maps). On the XV-5080, you can save the performance to one of +its 64 performance memory slots. Configuration of all 32 parts of the +synthesizer is restored from the save slot when a performance is loaded. +Just like the XV-5080, the SD-80 has a name assigned to its +“Multitimbre”, which is set to “Native Mode” upon entering its native +mode. But there are no memory slots for “multitimbres” in the SD-80, nor +is the name of multitimbre shown anywhere (either on the LCD screen, or +in the SD-80 Editor), rendering this name useless. This name is not +read-only. You can change it as you wish using system exclusive +messages, and is preserved until the next native mode reset message is +received.</p> +<p>Since the SD-80 is straight up the same when compared to the XV-5080 +in terms of synthesizer engine, and also has extremely similar MIDI +implementation <a id="n18" href="#note18" class="note">[18]</a>, the SD-80 can be seen as a +XV-5080 with locked-down samples. What the StudioCanvas series does +improve over its SoundCanvas predecessors, is its editability in native +mode, which is brought on par with its professional counterparts and +allow the user take full control of the sound for the first time +<a id="n19" href="#note19" class="note">[19]</a>. This is a huge step forward from the +lame set of a few parameters offered by earlier GS models. However there +is also stuff found in earlier models that’s no longer available in the +StudioCanvas, which we are going to touch on in a moment.</p> <h4 id="tocanch33" class="tvis">SD-80’s sound content</h4> -<p>Only a small chunk of SD-80’s content is brand new (at least to me) – for example, the harpsichord <a id="n20" href="#note20" class="note">[20]</a>, the clarinet, a few saxes and stereo crash cymbals. The rest are either from other Roland products, or modified from their existing content.</p> +<p>Only a small chunk of SD-80’s content is brand new (at least to me) – +for example, the harpsichord <a id="n20" href="#note20" class="note">[20]</a>, the clarinet, a few saxes and stereo crash cymbals. +The rest are either from other Roland products, or modified from their +existing content.</p> <ul> -<li>The sample “Trumpet Vib” used by the now infamous Romantic Tp (thanks to ZUN) is from SR-JV80-18 Latin expansion board. The original sample name is “Tp Vib MariA” (or B, or less likely C) <a id="n21" href="#note21" class="note">[21]</a> There are a lot more samples for various trumpet techniques in SR-JV80-18, particularly designed for Mexican mariachi music. These samples are also found in SRX-09 World Collection, which contains all samples from SR-JV80-18.</li> -<li>Acoustic drum set from the solo set is a cut down version of the studio kit from SRX-03 Studio, which is also the source of Super Quartet’s drums.</li> -<li>Piano patches are pulled straight from SR-JV80-09, which is also included in SRX-07. SC-8850 has the same Piano sound.</li> -<li>Clavi is almost identical to one of the many clavi patches from SC-8820/8850, and is likely ultimately from the JVs and SR-JV80 boards.</li> -<li>Samples of Flute vib sound identical to those with the same name (“Flute Vib3 A/B/C”) in SRX-03.</li> -<li>Samples of St.Brass and St.Sm Choir also come straight from SRX-03.</li> -<li>Multiple sound effects are from earlier SC models. Some are also used by XV-5080’s GM2 mode.</li> -<li>A lot of patches in the special sets are pulled from the XV-5080. They use the exact same parameters, except the waveforms. If you can find a preset with the same name as an instrument from SD-80’s special set in the XV-5080, chances are they sound almost identical, especially since a lot of them are analog/digital synth patches, and waveforms don’t matter as much. There are a few exceptions – a preset with the name “Cascade” is found in both instruments, but they have nothing in common except the name. There are also a lot of XV-5080 “inspired” patches: they have different names from the original XV-5080 patch, but very similar sound design. In fact, the “Cascade” patch mentioned above is one of these XV-5080 “inspired” patch, but you have to figure out the original yourself as I forgot which one it is.</li> -<li>Rave Set, Rust Set and Bully Set are adapted versions of XV’s RaveDrumSet, XV Rust Kit and XV Bully Kit respectively. The original XV kits are not GM-compatible.</li> -<li>Multiple orchestral instruments from the contemporary set and solo set use samples from SRX-06 (SR-JV80-02/16).</li> -<li>Bass and guitar are a mishmash from SR-JV80-09, SRX-03, SRX-07, SRX-09 and XV-5080. Some of them are used in other Roland products. (Fingered Bs2 vs SC-8850 Heart Bass, which is also almost identical to Rock Bass in Super Quartet, and the sample is from SR-JV80-09).</li> +<li>The sample “Trumpet Vib” used by the now infamous Romantic Tp +(thanks to ZUN) is from SR-JV80-18 Latin expansion board. The original +sample name is “Tp Vib MariA” (or B, or less likely C) <a id="n21" href="#note21" class="note">[21]</a> There are a lot more samples for various trumpet +techniques in SR-JV80-18, particularly designed for Mexican mariachi +music. These samples are also found in SRX-09 World Collection, which +contains all samples from SR-JV80-18.</li> +<li>Acoustic drum set from the solo set is a cut down version of the +studio kit from SRX-03 Studio, which is also the source of Super +Quartet’s drums.</li> +<li>Piano patches are pulled straight from SR-JV80-09, which is also +included in SRX-07. <del>SC-8850 has the same Piano sound.</del> No it +doesn’t. It uses the stereo piano samples from XV. Thanks for Arie on +Discord to point this out.</li> +<li>Clavi is almost identical to one of the many clavi patches from +SC-8820/8850, and is likely ultimately from the JVs and SR-JV80 +boards.</li> +<li>Samples of Flute vib sound identical to those with the same name +(“Flute Vib3 A/B/C”) in SRX-03.</li> +<li>Samples of St.Brass and St.Sm Choir also come straight from +SRX-03.</li> +<li>Multiple sound effects are from earlier SC models. Some are also +used by XV-5080’s GM2 mode.</li> +<li>A lot of patches in the special sets are pulled from the XV-5080. +They use the exact same parameters, except the waveforms. If you can +find a preset with the same name as an instrument from SD-80’s special +set in the XV-5080, chances are they sound almost identical, especially +since a lot of them are analog/digital synth patches, and waveforms +don’t matter as much. There are a few exceptions – a preset with the +name “Cascade” is found in both instruments, but they have nothing in +common except the name. There are also a lot of XV-5080 “inspired” +patches: they have different names from the original XV-5080 patch, but +very similar sound design. In fact, the “Cascade” patch mentioned above +is one of these XV-5080 “inspired” patch, but you have to figure out the +original yourself as I forgot which one it is.</li> +<li>Rave Set, Rust Set and Bully Set are adapted versions of XV’s +RaveDrumSet, XV Rust Kit and XV Bully Kit respectively. The original XV +kits are not GM-compatible.</li> +<li>Multiple orchestral instruments from the contemporary set and solo +set use samples from SRX-06 (SR-JV80-02/16).</li> +<li>Bass and guitar are a mishmash from SR-JV80-09, SRX-03, SRX-07, +SRX-09 and XV-5080. Some of them are used in other Roland products. +(Fingered Bs2 vs SC-8850 Heart Bass, which is also almost identical to +Rock Bass in Super Quartet, and the sample is from SR-JV80-09).</li> </ul> -<p>This list is far from complete. There has been extensive efforts to map the multisamples in the SD-80 to XV-5080 and SRX multisamples. <a href="//filestorage.chrisoft.org/blog/data/SD-80/SD-80_Waveform_Comparison.pdf">Here</a> is one made by Palto. These mappings are extremely useful if you wish to recreate SD-80 patches with Roland’s VSTi plugins.</p> -<p>So the content of the SD-80 is actually a mixture of XV-5080, SRX wave expansion boards, SR-JV80 boards, earlier SoundCanvas patches and maybe a few new sounds. Reusing stuff isn’t surprising for Roland, nor should it be considered “bad”. They’ve been known to do this <a href="https://www.soundonsound.com/reviews/roland-sc88">since the early SC days</a>, where they used JV- and SR-JV80 expansion board sounds in the old SC series. Evidently, the waveforms come with XV-5080 itself include everything from the JV-2080/1080, which are in turn partially from the JV-880, and eventually from the JD-800… I’ve also noted that SuperQuartet has a substantial overlapping set of instruments with SRX-03. All I want to say in this section is that if you want to get some particular sounds from the Studio Canvas, instead of waiting for a second-hand offering, maybe look somewhere else.</p> -<p>Since the content of SD-80 is mostly just cherrypicked XV/SRX content, it really doesn’t need any additional praise from me. However I think it’s worth pointing out that Roland’s samples of that era, just like sounds from most other vendors, are heavily looped. They have loop periods that are quite short (usually less than a second). They are also usually heavily preprocessed. As the amount of memory used for reproducing the instruments saw a huge boom in the 2000s, they no longer sound downright “fake” or “plasticky” compared to romplers from a decade ago. However when compared against huge modern sample libraries, most instruments from these 2000s Roland romplers sound more “idealistic” rather than “realistic”, just like your average Japanese anime girls with unrealistically huge eyes. Not saying that such sound is bad, though.</p> -<p>The GS sounds and XGLite sounds of the SD-80 are completely trash. The GS sound set is pretty much just the SC-55 map in later SoundCanvas models using SD-80 samples. The XGLite sound set however, is notably larger than the average bottom-of-the-line Yamaha Portatones from the early 2000s (the XGLite instrument listing in SD-80/90’s manual is incomplete. Check my first SD-80 post for a complete list). There are probably only 5 or so usable sounds offered in these modes in total (most of which are in the XGLite sound set, which is kind of ironic for a Roland sound module). It’s not worth it to switch modes just for those sounds, especially since these modes don’t support low-level editing like the native mode.</p> -<p>The SD-80 features 1050 instruments and 30 drum sets, which is a significant decrease from the last generation SC-8850 (1640 instruments and 63 drum sets). The loss of SC-8850’s ethnic and analog instruments is a shame. But the quality of instruments does receive a general uplift.</p> -<h3 id="tocanch34" class="tvis">More on SD-80 vs SD-90 vs SD-20</h3> -<h4 id="tocanch35" class="tvis">What does a SD-90 have that SD-80 doesn’t?</h4> -<p>Easy. The audio interface (together with post-processing effects) and the large screen.</p> -<p>It is a shame that Roland didn’t implement full XV-level editability of patches on such a large screen though.</p> -<p>SD-80 is also not capable of switching the output sample rate on its digital audio outputs.</p> -<h4 id="tocanch36" class="tvis">What does a SD-80 have that SD-90 doesn’t?</h4> -<p>This may come as a shocker, because the list is surprisingly long.</p> +<p>This list is far from complete. There has been extensive efforts to +map the multisamples in the SD-80 to XV-5080 and SRX multisamples. <a href="//filestorage.chrisoft.org/blog/data/SD-80/SD-80_Waveform_Comparison.pdf">Here</a> +is one made by Palto. These mappings are extremely useful if you wish to +recreate SD-80 patches with Roland’s VSTi plugins.</p> +<p>So the content of the SD-80 is actually a mixture of XV-5080, SRX +wave expansion boards, SR-JV80 boards, earlier SoundCanvas patches and +maybe a few new sounds. Reusing stuff isn’t surprising for Roland, nor +should it be considered “bad”. They’ve been known to do this <a href="https://www.soundonsound.com/reviews/roland-sc88">since the early +SC days</a>, where they used JV- and SR-JV80 expansion board sounds in +the old SC series. Evidently, the waveforms come with XV-5080 itself +include everything from the JV-2080/1080, which are in turn partially +from the JV-880, and eventually from the JD-800… I’ve also noted that +SuperQuartet has a substantial overlapping set of instruments with +SRX-03. All I want to say in this section is that if you want to get +some particular sounds from the Studio Canvas, instead of waiting for a +second-hand offering, maybe look somewhere else.</p> +<p>Since the content of SD-80 is mostly just cherrypicked XV/SRX +content, it really doesn’t need any additional praise from me. However I +think it’s worth pointing out that Roland’s samples of that era, just +like sounds from most other vendors, are heavily looped. They have loop +periods that are quite short (usually less than a second). They are also +usually heavily preprocessed. As the amount of memory used for +reproducing the instruments saw a huge boom in the 2000s, they no longer +sound downright “fake” or “plasticky” compared to romplers from a decade +ago. However when compared against huge modern sample libraries, most +instruments from these 2000s Roland romplers sound more “idealistic” +rather than “realistic”, just like your average Japanese anime girls +with unrealistically huge eyes. Not saying that such sound is bad, +though.</p> +<p>The GS sounds and XGLite sounds of the SD-80 are completely trash. +The GS sound set is pretty much just the SC-55 map in later SoundCanvas +models using SD-80 samples. The XGLite sound set however, is notably +larger than the average bottom-of-the-line Yamaha Portatones from the +early 2000s (the XGLite instrument listing in SD-80/90’s manual is +incomplete. Check my first SD-80 post for a complete list). There are +probably only 5 or so usable sounds offered in these modes in total +(most of which are in the XGLite sound set, which is kind of ironic for +a Roland sound module). It’s not worth it to switch modes just for those +sounds, especially since these modes don’t support low-level editing +like the native mode.</p> +<p>The SD-80 features 1050 instruments and 30 drum sets, which is a +significant decrease from the last generation SC-8850 (1640 instruments +and 63 drum sets). The loss of SC-8850’s ethnic and analog instruments +is a shame. But the quality of instruments does receive a general +uplift.</p> +<h3 id="tocanch34" class="tvis">More on SD-80 vs SD-90 vs +SD-20</h3> +<h4 id="tocanch35" class="tvis">What does a SD-90 have +that SD-80 doesn’t?</h4> +<p>Easy. The audio interface (together with post-processing effects) and +the large screen.</p> +<p>It is a shame that Roland didn’t implement full XV-level editability +of patches on such a large screen though.</p> +<p>SD-80 is also not capable of switching the output sample rate on its +digital audio outputs.</p> +<h4 id="tocanch36" class="tvis">What does a SD-80 have +that SD-90 doesn’t?</h4> +<p>This may come as a shocker, because the list is surprisingly +long.</p> <ul> <li>User instruments and user rhythm sets. <a id="n22" href="#note22" class="note">[22]</a></li> -<li>A few weird switches controlling its global state (MFX on/off, reverb/chorus switch). They are weird because they are not affected by the native mode reset message. These switches are also featured in the SD-80 editor, which Roland says don’t do anything if used with an SD-90. They are also present in the professional XV line-up.</li> -<li>Multiple outputs from the synthesizer. The SD-90 does have a secondary output, but the internal synthesizer can only use one of them. The SD-80 has two stereo outputs, which can also be used as four mono outputs. This also allows the SD-80 to have…</li> -<li>Ability to output synthesizer effects to a separate bus. You can specify the output for the internal reverb, chorus and multi-effects as well.</li> +<li>A few weird switches controlling its global state (MFX on/off, +reverb/chorus switch). They are weird because they are not affected by +the native mode reset message. These switches are also featured in the +SD-80 editor, which Roland says don’t do anything if used with an SD-90. +They are also present in the professional XV line-up.</li> +<li>Multiple outputs from the synthesizer. The SD-90 does have a +secondary output, but the internal synthesizer can only use one of them. +The SD-80 has two stereo outputs, which can also be used as four mono +outputs. This also allows the SD-80 to have…</li> +<li>Ability to output synthesizer effects to a separate bus. You can +specify the output for the internal reverb, chorus and multi-effects as +well.</li> </ul> <h4 id="tocanch37" class="tvis">What’s the SD-20 anyway?</h4> <p>Turns out it’s not much.</p> -<p><a href="https://chrisoft.org/blog/post/2021-10-10.html">There’s going to be a separate article on this.</a></p> +<p><a href="https://chrisoft.org/blog/post/2021-10-10.html">There’s +going to be a separate article on this.</a></p> <h4 id="tocanch38" class="tvis">What role does MFX play?</h4> -<p>It depends. If the MFX is just some reverb, EQ, or chorus, it really doesn’t make a whole world of difference and can be easily replaced with basic external effects. If its an amplifier simulator, a pitch shifter, or an auto filter, disabling MFX will result in a drastic sound change. Plugins simulating these effects are also usually harder to come by / more expensive. A few demonstrations of patches with and without MFX are in the table below.</p> +<p>It depends. If the MFX is just some reverb, EQ, or chorus, it really +doesn’t make a whole world of difference and can be easily replaced with +basic external effects. If its an amplifier simulator, a pitch shifter, +or an auto filter, disabling MFX will result in a drastic sound change. +Plugins simulating these effects are also usually harder to come by / +more expensive. A few demonstrations of patches with and without MFX are +in the table below.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -1519,39 +2353,146 @@ Stereo Auto Wah </tr> </tbody></table> </div> -<h3 id="tocanch39" class="tvis"><code>Light Load</code> vs <code>High Load</code></h3> -<p>There is a toggle for “Light Load” mode in the driver for SD-80 on all platforms, including Linux. What this option actually does is not documented. The only thing I know is that in the Linux driver this is implemented with a single <code>usb_set_interface</code> call.</p> -<p>This setting doesn’t seem to affect the synth engine, only the way how midi data is transmitted / processed (because the drivers for UA-25 has this option as well). Weirdly, Roland’s contemporary software synthesizers (HyperCanvas/TTS-1, SuperQuartet, Orchestral) also have this option.</p> +<h3 id="tocanch39" class="tvis"><code>Light Load</code> vs +<code>High Load</code></h3> +<p>There is a toggle for “Light Load” mode in the driver for SD-80 on +all platforms, including Linux. What this option actually does is not +documented. The only thing I know is that in the Linux driver this is +implemented with a single <code>usb_set_interface</code> call.</p> +<p>This setting doesn’t seem to affect the synth engine, only the way +how midi data is transmitted / processed (because the drivers for UA-25 +has this option as well). Weirdly, Roland’s contemporary software +synthesizers (HyperCanvas/TTS-1, SuperQuartet, Orchestral) also have +this option.</p> <h3 id="tocanch40" class="tvis">Block Diagram</h3> -<p>I made <a href="//filestorage.chrisoft.org/blog/data/SD-80/sd80blk_notext_o.svg">this vectorized version</a> of SD-80’s block diagram printed on its chassis when I was bored. You can also get a <a href="//filestorage.chrisoft.org/blog/data/SD-80/sd80blk_notext_o_nt.png">rasterized version</a>.</p> -<h3 id="tocanch41" class="tvis">Other weird and interesting stuff</h3> +<p>I made <a href="//filestorage.chrisoft.org/blog/data/SD-80/sd80blk_notext_o.svg">this +vectorized version</a> of SD-80’s block diagram printed on its chassis +when I was bored. You can also get a <a href="//filestorage.chrisoft.org/blog/data/SD-80/sd80blk_notext_o_nt.png">rasterized +version</a>.</p> +<h3 id="tocanch41" class="tvis">Other weird and interesting +stuff</h3> <ul> -<li>Very few (if any) preset patches uses the modulation matrix of the XV engine correctly. All of them has the modulation source set to ‘OFF’.</li> -<li>Only 5 of all preset patches used non-default tone structures: “Runaway Rez”, “Purple Spin”, “FM layer”, “FM Delight”, and “Xmod EP”. All of them are in the special sets. 3 of them are unmodified XV-5080 patches.</li> -<li>There doesn’t seem to be a way to set the system tempo of the SD-80/90 with MIDI messages, nor can the SD-80/90 sync its MIDI clock with a host, rendering the system clock mostly useless. Neither of these two is true for the XV-5080.</li> -<li>Ever wondered why some patches have seemingly nonsensical waveforms selected in disabled tones <a id="n23" href="#note23" class="note">[23]</a>? Just look up those wave numbers in the waveform list of XV-5080 or the corresponding SRX board! <a id="n24" href="#note24" class="note">[24]</a> This, once again, suggests Roland used the XV-5080 as the development platform for the StudioCanvas.</li> -<li>From Sound On Sound’s review of the SD-90: “To me, however, USB audio and the Sound Canvas sound set don’t add up to £799, and although I grew to like the SD90, I’m not sure how many people will find it attractive at this price point.” – ZUN, apparently.</li> +<li>Very few (if any) preset patches uses the modulation matrix of the +XV engine correctly. All of them has the modulation source set to +‘OFF’.</li> +<li>Only 5 of all preset patches used non-default tone structures: +“Runaway Rez”, “Purple Spin”, “FM layer”, “FM Delight”, and “Xmod EP”. +All of them are in the special sets. 3 of them are unmodified XV-5080 +patches.</li> +<li>There doesn’t seem to be a way to set the system tempo of the +SD-80/90 with MIDI messages, nor can the SD-80/90 sync its MIDI clock +with a host, rendering the system clock mostly useless. Neither of these +two is true for the XV-5080.</li> +<li>Ever wondered why some patches have seemingly nonsensical waveforms +selected in disabled tones <a id="n23" href="#note23" class="note">[23]</a>? Just look up those wave +numbers in the waveform list of XV-5080 or the corresponding SRX board! +<a id="n24" href="#note24" class="note">[24]</a> This, once again, suggests +Roland used the XV-5080 as the development platform for the +StudioCanvas.</li> +<li>From Sound On Sound’s review of the SD-90: “To me, however, USB +audio and the Sound Canvas sound set don’t add up to £799, and although +I grew to like the SD90, I’m not sure how many people will find it +attractive at this price point.” – ZUN, apparently.</li> </ul> <h2 id="tocanch42" class="tvis">Errata of the original post</h2> <ul> -<li>The non-zero “modulation level” (which is actually “modulation depth”) on the SD-80 isn’t the value of the modulation wheel itself, but rather how deep a modulation wheel pushed all the way to the top will modulate the sound. SD-90 also has a default value of 10 for it (“Mod LFO Pitch Depth” in the address mapping). There’s no GM incompatibility here.</li> -<li>Instruments sampled with vibrato are not from the XV-5080, they are from the SRX / SR-JV80 boards. Duh.</li> -<li>XP6 <em>was</em> used in professional products. In fact, a handful of them (XV-3080, XV-88, JV-1010 and possibly more).</li> -<li>Roland still makes romplers today. It’s a model from a decade ago. You’ll have to guess which model it is.</li> +<li>The non-zero “modulation level” (which is actually “modulation +depth”) on the SD-80 isn’t the value of the modulation wheel itself, but +rather how deep a modulation wheel pushed all the way to the top will +modulate the sound. SD-90 also has a default value of 10 for it (“Mod +LFO Pitch Depth” in the address mapping). There’s no GM incompatibility +here.</li> +<li>Instruments sampled with vibrato are not from the XV-5080, they are +from the SRX / SR-JV80 boards. Duh.</li> +<li>XP6 <em>was</em> used in professional products. In fact, a handful +of them (XV-3080, XV-88, JV-1010 and possibly more).</li> +<li>Roland still makes romplers today. It’s a model from a decade ago. +You’ll have to guess which model it is.</li> </ul> <h2 id="tocanch43" class="tvis">References</h2> <ul> -<li><a href="https://www.dtech.lv/techarticles_roland_exp.html">Roland Wave Expansion Cards by Edward D-tech</a></li> -<li><a href="http://www.donsolaris.com/?p=404">Don Solaris’ ultimate Roland JV/JD/XV FAQ</a></li> -<li><a href="https://www.sweetwater.com/insync/cosm/">What is COSM?</a></li> -<li><a href="https://www.soundonsound.com/reviews/roland-xv5080">SOS Review of XV-5080</a></li> -<li><a href="https://www.soundonsound.com/reviews/edirol-sd90">SOS Review of SD-90</a></li> -<li><a href="https://www.soundonsound.com/reviews/edirol-sd80">SOS Review of SD-80</a></li> -<li><a href="https://www.soundonsound.com/reviews/roland-sc88">SOS Review of SC-88</a></li> +<li><a href="https://www.dtech.lv/techarticles_roland_exp.html">Roland +Wave Expansion Cards by Edward D-tech</a></li> +<li><a href="http://www.donsolaris.com/?p=404">Don Solaris’ ultimate +Roland JV/JD/XV FAQ</a></li> +<li><a href="https://www.sweetwater.com/insync/cosm/">What is +COSM?</a></li> +<li><a href="https://www.soundonsound.com/reviews/roland-xv5080">SOS +Review of XV-5080</a></li> +<li><a href="https://www.soundonsound.com/reviews/edirol-sd90">SOS +Review of SD-90</a></li> +<li><a href="https://www.soundonsound.com/reviews/edirol-sd80">SOS +Review of SD-80</a></li> +<li><a href="https://www.soundonsound.com/reviews/roland-sc88">SOS +Review of SC-88</a></li> </ul> </article> </div><br><hr> - <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: Judging by the way Roland utilized the SH-3 CPU in MC-909, which has a 16MHz external clock input and a 8x multiplier (128MHz internal clock), I would guess the CPU in SD-80 also works at 8x multiplier and therefore 96MHz internally.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: Later the source of this DC bias is determined to be SD-80 itself, not the recording device. See the next section.<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: オールインワン・モデルSD-90でご好評いただいた、新開発MIDI音源部を搭載したマルチティンバー音源が登場。 As seen <a href="https://web.archive.org/web/20020604015208/http://www.roland.co.jp/products/dtm/SD-80.html">here</a>. I don’t actually know any Japanese and just pieced stuff together randomly. Sorry if I butchered your language.<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: Munt isn’t strictly an emulation. It doesn’t emulate the CPU or actual circuitry of the MT-32. See below.<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: without Roland losing their mind and releasing all internal documentation on the XV engine, or some absolute madlad spending 15 hours everyday on reverse engineering the thing for half a year, that is.<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: SD-80 has 32MiB of compressed wave ROM, see the “list of integrated circuit chips on SD-80 main board” in the first section. Roland’s waveform compression scheme usually results in a ~50% compression ratio. Therefore the content is roughly equal to 64 MiB of uncompressed 16-bit PCM wave.<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: The “23C128” kind of gave it away – they are the <code>μPD23C128040ALGY</code> mask ROM chips from NEC, which is the exact same type of ROM used in XV-5080. Unlike the XV-5080 though, the SD-80 makes use of both its J variant and K variant, while the XV-5080 only uses the J variant (these variants have symmetric pin configuration). <br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: Well, the Raspberry Pi isn’t really suitable for this task because it doesn’t have enough GPIO pins. But there’s an easy workaround for that.<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: For readers who wonders what “mask” means in this context: you can treat a mask ROM as a huge array of tiny switches that can’t be turned on or off once manufactured. You can access the state of a group of switches by giving an address to its input pins. The mask is used as a template of the states of these switches during the manufacture process. This is electrical engineering amateur Chris trying to explain mask ROM in layman’s terms.<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: HyperCanvas (HQ-GM2) or Cakewalk TTS-1, which is a rebranding of the former; SuperQuartet (HQ-QT) and Orchestral (HQ-OR). A plugin called GrooveSynth (P5antom) bundled with several earlier Cakewalk products providing patches from the MC-303 Groovebox also uses this engine.<br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: which is kind of weird considering Spectrasonics basically spun off from Roland<br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: Also used in XP-80, see the errata section of its service manual.<br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: HD64F7017F28, SH7017 in parts list<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: 40 of the 90 types will take up all three slots, most likely due to the reduced DSP power.<br></span><span class="TText"><a id="note15" href="#n15">[15]</a>: Support for multisamples also exist in Fantom S/S88, so this is more likely due to an updated system software rather than changes of the synth engine.<br></span><span class="TText"><a id="note16" href="#n16">[16]</a>: There is evidence that some of them are handled by software (SD-80 having one more LFO per part than the XV-5080). However it can also be using LFO blocks in the XV chip that is unused in the XV-5080.<br></span><span class="TText"><a id="note17" href="#n17">[17]</a>: This mapping is used for DT1/RQ1 system exclusive messages.<br></span><span class="TText"><a id="note18" href="#n18">[18]</a>: The first half is also true for earlier SC models (SC-55 <-> JV-880, SC-88 <-> JV-1080, SC-88Pro <-> JV-2080, SC-8850 <-> XV-3080). However the second half isn’t. Earlier SC models employs a GS-specific address map which looks nothing like their counterparts.<br></span><span class="TText"><a id="note19" href="#n19">[19]</a>: And also the last time, since neither the SD-20 nor the SD-50 has such editability.<br></span><span class="TText"><a id="note20" href="#n20">[20]</a>: Apparently it’s from the SC-8850.<br></span><span class="TText"><a id="note21" href="#n21">[21]</a>: The multisample from Roland Cloud seem to have an extra sample in the highest register, which sounds like it’s processed with a low-pass filter with very low cut off frequency and makes it sound like garbage. This is also the case for the version included in the original SRX-09 boards.<br></span><span class="TText"><a id="note22" href="#n22">[22]</a>: The owner’s manual of the SD-80 contains blatant lies. It says “It is not possible for the edited sounds to be saved in the internal memory of the SD-80” (which is directly copied from SD-90’s manual), and goes on to teach you how to save a user patch.<br></span><span class="TText"><a id="note23" href="#n23">[23]</a>: For example, nearly all acoustic bass patches have a disabled tone with wave number 249 “TenBlwSaxVib” selected, and the Fiddle 2 vib patch have a disabled tone with wave number 276 “Blow Pipe” selected.<br></span><span class="TText"><a id="note24" href="#n24">[24]</a>: Wave #249 in XV-5080 is UprightBs 2A, and Wave #276 in SRX-09 is Fdl Pizz 1C (Fiddle Pizzicato).<br></span></div> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: Judging by the way Roland +utilized the SH-3 CPU in MC-909, which has a 16MHz external clock input +and a 8x multiplier (128MHz internal clock), I would guess the CPU in +SD-80 also works at 8x multiplier and therefore 96MHz +internally.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: Later the source of this DC bias is determined to +be SD-80 itself, not the recording device. See the next +section.<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: オールインワン・モデルSD-90でご好評いただいた、新開発MIDI音源部を搭載したマルチティンバー音源が登場。 +As seen <a href="https://web.archive.org/web/20020604015208/http://www.roland.co.jp/products/dtm/SD-80.html">here</a>. +I don’t actually know any Japanese and just pieced stuff together +randomly. Sorry if I butchered your language.<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: Munt isn’t strictly an emulation. It doesn’t emulate the CPU +or actual circuitry of the MT-32. See below.<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: without Roland losing their mind and releasing all +internal documentation on the XV engine, or some absolute madlad +spending 15 hours everyday on reverse engineering the thing for half a +year, that is.<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: SD-80 has 32MiB of compressed wave ROM, see the “list of +integrated circuit chips on SD-80 main board” in the first section. +Roland’s waveform compression scheme usually results in a ~50% +compression ratio. Therefore the content is roughly equal to 64 MiB of +uncompressed 16-bit PCM wave.<br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: The “23C128” kind of gave it away – +they are the <code>μPD23C128040ALGY</code> mask ROM chips from NEC, +which is the exact same type of ROM used in XV-5080. Unlike the XV-5080 +though, the SD-80 makes use of both its J variant and K variant, while +the XV-5080 only uses the J variant (these variants have symmetric pin +configuration). <br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: Well, the +Raspberry Pi isn’t really suitable for this task because it doesn’t have +enough GPIO pins. But there’s an easy workaround for that.<br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: For readers who wonders what “mask” means in +this context: you can treat a mask ROM as a huge array of tiny switches +that can’t be turned on or off once manufactured. You can access the +state of a group of switches by giving an address to its input pins. The +mask is used as a template of the states of these switches during the +manufacture process. This is electrical engineering amateur Chris trying +to explain mask ROM in layman’s terms.<br></span><span class="TText"><a id="note10" href="#n10">[10]</a>: HyperCanvas (HQ-GM2) or Cakewalk TTS-1, which is a rebranding +of the former; SuperQuartet (HQ-QT) and Orchestral (HQ-OR). A plugin +called GrooveSynth (P5antom) bundled with several earlier Cakewalk +products providing patches from the MC-303 Groovebox also uses this +engine.<br></span><span class="TText"><a id="note11" href="#n11">[11]</a>: which is kind of weird considering +Spectrasonics basically spun off from Roland<br></span><span class="TText"><a id="note12" href="#n12">[12]</a>: Also used in XP-80, see the errata +section of its service manual.<br></span><span class="TText"><a id="note13" href="#n13">[13]</a>: HD64F7017F28, SH7017 in parts +list<br></span><span class="TText"><a id="note14" href="#n14">[14]</a>: 40 of the +90 types will take up all three slots, most likely due to the reduced +DSP power.<br></span><span class="TText"><a id="note15" href="#n15">[15]</a>: Support for multisamples also exist in Fantom +S/S88, so this is more likely due to an updated system software rather +than changes of the synth engine.<br></span><span class="TText"><a id="note16" href="#n16">[16]</a>: There is evidence that some of them +are handled by software (SD-80 having one more LFO per part than the +XV-5080). However it can also be using LFO blocks in the XV chip that is +unused in the XV-5080.<br></span><span class="TText"><a id="note17" href="#n17">[17]</a>: This mapping is used for +DT1/RQ1 system exclusive messages.<br></span><span class="TText"><a id="note18" href="#n18">[18]</a>: The first half is also true for earlier SC +models (SC-55 <-> JV-880, SC-88 <-> JV-1080, SC-88Pro +<-> JV-2080, SC-8850 <-> XV-3080). However the second half +isn’t. Earlier SC models employs a GS-specific address map which looks +nothing like their counterparts.<br></span><span class="TText"><a id="note19" href="#n19">[19]</a>: And also the last time, since neither the SD-20 nor the SD-50 +has such editability.<br></span><span class="TText"><a id="note20" href="#n20">[20]</a>: Apparently it’s from the +SC-8850.<br></span><span class="TText"><a id="note21" href="#n21">[21]</a>: The +multisample from Roland Cloud seem to have an extra sample in the +highest register, which sounds like it’s processed with a low-pass +filter with very low cut off frequency and makes it sound like garbage. +This is also the case for the version included in the original SRX-09 +boards.<br></span><span class="TText"><a id="note22" href="#n22">[22]</a>: The owner’s manual +of the SD-80 contains blatant lies. It says “It is not possible for the +edited sounds to be saved in the internal memory of the SD-80” (which is +directly copied from SD-90’s manual), and goes on to teach you how to +save a user patch.<br></span><span class="TText"><a id="note23" href="#n23">[23]</a>: For example, nearly all acoustic +bass patches have a disabled tone with wave number 249 “TenBlwSaxVib” +selected, and the Fiddle 2 vib patch have a disabled tone with wave +number 276 “Blow Pipe” selected.<br></span><span class="TText"><a id="note24" href="#n24">[24]</a>: Wave #249 in XV-5080 is UprightBs 2A, and Wave #276 in SRX-09 +is Fdl Pizz 1C (Fiddle Pizzicato).<br></span></div> <div id="insanch" style="height:3em;"></div> <div id="footer" style=""> <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> diff --git a/blog/post/2021-06-03.html b/blog/post/2021-06-03.html index 9a3379d..7075e4c 100644 --- a/blog/post/2021-06-03.html +++ b/blog/post/2021-06-03.html @@ -1,4 +1,4 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> @@ -49,31 +49,44 @@ function ol() <li id="tocouter"> <span>Table of Contents</span> <ul id="tocroot"> - <li><a class="toctarg" href="#tocanch0">Quick status update</a></li><li><a class="toctarg" href="#tocanch1">What have I done</a></li><li><a class="toctarg" href="#tocanch2">When are the unfinished posts gonna be finished?</a></li></ul> + <li><a class="toctarg" href="#tocanch0">Quick status update</a></li><li><a class="toctarg" href="#tocanch1">What have I done</a></li><li><a class="toctarg" href="#tocanch2">When are the +unfinished posts gonna be finished?</a></li></ul> </li> - <li style="margin-left:-0.5em"><a id="prevp" href="2019-09-04.html">Prev post</a></li> - <li style="margin-left:-0.5em"><a id="nextp" href="Privacy.html">Next post</a></li> + <li style="margin-left:-0.5em"><a id="prevp" href="2020-11-20.html">Prev post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="2021-10-10.html">Next post</a></li> </ul> </div> <div id="content"> <h2 id="titleh" class="TText" style="font-wight:normal;">No, I'm not dead</h2> <div id="datetags" class="TText" style="margin-bottom:1em;">2021-06-03<br>#garbage</div> <hr><div id="article" class="TText"><article> -<p>No I’m not dead. Sure this blog has been snubbed for quite a while now, and I just marked 5 old unfinished posts (from 2019 all the way to 2021) as WIP so that they do not appear here. Just not feeling finishing them up (or writing anything) right now.</p> +<p>No I’m not dead. Sure this blog has been snubbed for quite a while +now, and I just marked 5 old unfinished posts (from 2019 all the way to +2021) as WIP so that they do not appear here. Just not feeling finishing +them up (or writing anything) right now.</p> <h2 id="tocanch0" class="tvis">Quick status update</h2> -<p>I’m doing random, stupid researches – as an average computer scientist wannabe. Also I’m learning Latin. Nondum possum loqui. (or write, for that matter – sudden code-switching)</p> +<p>I’m doing random, stupid researches – as an average computer +scientist wannabe. Also I’m learning Latin. Nondum possum loqui. (or +write, for that matter – sudden code-switching)</p> <h2 id="tocanch1" class="tvis">What have I done</h2> <ul> -<li><a href="https://github.com/chirs241097/jline4mcdsrv">My first Minecraft mod</a> (server only, and unrelated to gameplay – so probably uninteresting to anyone but server maintainers)</li> -<li><a href="https://github.com/FluidSynth/fluidsynth/commits?author=chirs241097">A few fluidsynth commits</a></li> -<li>Trying to extract stuff from my SD-80 (and failing no-so-spectacularly)</li> +<li><a href="https://github.com/chirs241097/jline4mcdsrv">My first +Minecraft mod</a> (server only, and unrelated to gameplay – so probably +uninteresting to anyone but server maintainers)</li> +<li><a href="https://github.com/FluidSynth/fluidsynth/commits?author=chirs241097">A +few fluidsynth commits</a></li> +<li>Trying to extract stuff from my SD-80 (and failing +no-so-spectacularly)</li> <li>Messing on a shitty block game server called 2b2t</li> <li>Writing a skyblock datapack, and playing it</li> -<li>Random researches in various CS fields until I could settle somewhere firmly</li> +<li>Random researches in various CS fields until I could settle +somewhere firmly</li> <li>Falling into the functional programming cult</li> </ul> -<h2 id="tocanch2" class="tvis">When are the unfinished posts gonna be finished?</h2> -<p>I don’t know. I reckon that would be somewhere in <redacted>.</p> +<h2 id="tocanch2" class="tvis">When are the +unfinished posts gonna be finished?</h2> +<p>I don’t know. I reckon that would be somewhere in +<redacted>.</p> </article> </div><br><hr> <div class="TText" id="notediv" style="font-size:80%;"></div> diff --git a/blog/post/2021-10-10.html b/blog/post/2021-10-10.html index 9b31d8c..a93caf3 100644 --- a/blog/post/2021-10-10.html +++ b/blog/post/2021-10-10.html @@ -49,10 +49,11 @@ function ol() <li id="tocouter"> <span>Table of Contents</span> <ul id="tocroot"> - <li><a class="toctarg" href="#tocanch0">The Encounter</a></li><li><a class="toctarg" href="#tocanch1">The Module</a></li><li><a class="toctarg" href="#tocanch2">The Setup</a></li><li><a class="toctarg" href="#tocanch3">The Sounds</a></li><li><a class="toctarg" href="#tocanch4">The Editability</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch5">The Quirks</a></li></ul></li><li><a class="toctarg" href="#tocanch6">The Manual</a></li><li><a class="toctarg" href="#tocanch7">The Insides</a></li><li><a class="toctarg" href="#tocanch8">The Secrets</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch9">Test mode</a></li><li><a class="toctarg" href="#tocanch10">unknown (likely firmware update) mode</a></li></ul></li><li><a class="toctarg" href="#tocanch11">The Conclusion</a></li><li><a class="toctarg" href="#tocanch12">The … Death?</a></li></ul> + <li><a class="toctarg" href="#tocanch0">The Encounter</a></li><li><a class="toctarg" href="#tocanch1">The Module</a></li><li><a class="toctarg" href="#tocanch2">The Setup</a></li><li><a class="toctarg" href="#tocanch3">The Sounds</a></li><li><a class="toctarg" href="#tocanch4">The Editability</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch5">The Quirks</a></li></ul></li><li><a class="toctarg" href="#tocanch6">The Manual</a></li><li><a class="toctarg" href="#tocanch7">The Insides</a></li><li><a class="toctarg" href="#tocanch8">The Secrets</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch9">Test mode</a></li><li><a class="toctarg" href="#tocanch10">unknown (likely firmware +update) mode</a></li></ul></li><li><a class="toctarg" href="#tocanch11">The Conclusion</a></li><li><a class="toctarg" href="#tocanch12">The … Death?</a></li></ul> </li> <li style="margin-left:-0.5em"><a id="prevp" href="2021-06-03.html">Prev post</a></li> - <li style="margin-left:-0.5em"><a id="nextp" href="Privacy.html">Next post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="2022-07-23.html">Next post</a></li> </ul> </div> <div id="content"> @@ -118,39 +119,88 @@ for(let x of al) }); </script> <article> -<p>I was intrigued by the insides of EDIROL’s SD-20. How on earth did Roland squeeze half of SD-80’s content in to a package that’s smaller than SD-80’s main board? Turns out it was by crippling the product…</p> +<p>I was intrigued by the insides of EDIROL’s SD-20. How on earth did +Roland squeeze half of SD-80’s content in to a package that’s smaller +than SD-80’s main board? Turns out it was by crippling the product…</p> <h2 id="tocanch0" class="tvis">The Encounter</h2> -<p>I didn’t get my SD-20 for $50 as promised in my SD-80 article. The lowest price I found when I started watching for spares again was $75. It stayed there for over half a year. But just weeks before I got into the States, it was gone. All the rest of the listings asked for ridiculous prices ranging from $150 to $250. There’s no way I will pay over $100 for a SD-20. So I waited and waited…</p> -<p>Until one day a new listing popped up. It was exactly $100 (with free shipping). “Well,” I thought, “this is it.” It accepts best offer, but nobody else offered to buy it until the listing ended. That’s the bizarre story of me getting my SD-20 at my max acceptable price…</p> +<p>I didn’t get my SD-20 for $50 as promised in my SD-80 article. The +lowest price I found when I started watching for spares again was $75. +It stayed there for over half a year. But just weeks before I got into +the States, it was gone. All the rest of the listings asked for +ridiculous prices ranging from $150 to $250. There’s no way I will pay +over $100 for a SD-20. So I waited and waited…</p> +<p>Until one day a new listing popped up. It was exactly $100 (with free +shipping). “Well,” I thought, “this is it.” It accepts best offer, but +nobody else offered to buy it until the listing ended. That’s the +bizarre story of me getting my SD-20 at my max acceptable price…</p> <h2 id="tocanch1" class="tvis">The Module</h2> -<p>I felt the cheapness inside instantly when I picked up the package: the SD-20 (with the included, somewhat dodgy aftermarket power adapter) weights absolutely nothing! It’s even lighter than the ThinkPad mouse I occasionally use. That doesn’t inspire much faith on its insides.</p> -<p>The exterior of the module is made of plastic exclusively. No metal whatsoever (except on the connectors). SD-80’s metal front cover weights more than this entire thing…</p> -<p>Flipping the module around reveals the dreaded three word phrase: “Made in China”. I wonder how many products that are never available in China at all are assembled in China.</p> -<p>There’s only one button and one knob on the front panel of the SD-20. This is even more cut down than the SC-8820, which also has only one button and one knob, but the volume knob doubles as a preview button.</p> -<p>Roland clearly made SD-20 the intended successor of SC-8820. Just look at the pictures in the manuals. They have nearly identical form factors. Let’s see how their sounds will compare.</p> -<p>The choice of ports is kind of weird on the SD-20. It’s almost identical to the ports on the back of the SC-8820, except the audio input being replaced by a 3.5mm combo jack, addition of an optical S/PDIF TOSLINK port, and omission of the DIN MIDI out port. The serial port (mini DIN 8-pin) featured on all older SC models made its only reappearance in the SD series. Despite having an audio input port, the SD-20, just like its predecessors in the SC family, doesn’t have any digital audio interface functionality. The audio input is merely passed through to the analog output.</p> +<p>I felt the cheapness inside instantly when I picked up the package: +the SD-20 (with the included, somewhat dodgy aftermarket power adapter) +weights absolutely nothing! It’s even lighter than the ThinkPad mouse I +occasionally use. That doesn’t inspire much faith on its insides.</p> +<p>The exterior of the module is made of plastic exclusively. No metal +whatsoever (except on the connectors). SD-80’s metal front cover weights +more than this entire thing…</p> +<p>Flipping the module around reveals the dreaded three word phrase: +“Made in China”. I wonder how many products that are never available in +China at all are assembled in China.</p> +<p>There’s only one button and one knob on the front panel of the SD-20. +This is even more cut down than the SC-8820, which also has only one +button and one knob, but the volume knob doubles as a preview +button.</p> +<p>Roland clearly made SD-20 the intended successor of SC-8820. Just +look at the pictures in the manuals. They have nearly identical form +factors. Let’s see how their sounds will compare.</p> +<p>The choice of ports is kind of weird on the SD-20. It’s almost +identical to the ports on the back of the SC-8820, except the audio +input being replaced by a 3.5mm combo jack, addition of an optical +S/PDIF TOSLINK port, and omission of the DIN MIDI out port. The serial +port (mini DIN 8-pin) featured on all older SC models made its only +reappearance in the SD series. Despite having an audio input port, the +SD-20, just like its predecessors in the SC family, doesn’t have any +digital audio interface functionality. The audio input is merely passed +through to the analog output.</p> <table> <tbody><tr> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sd20_module.jpg"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sd20_module.jpg"></a> <br>SD-20 on top of the SD-80 +<a href="//filestorage.chrisoft.org/blog/img/sd20_module.jpg"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sd20_module.jpg"></a> <br>SD-20 on top of +the SD-80 </div> </td> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sd20_bottom.jpg"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sd20_bottom.jpg"></a> <br>Bottom with serial number censored +<a href="//filestorage.chrisoft.org/blog/img/sd20_bottom.jpg"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sd20_bottom.jpg"></a> <br>Bottom with +serial number censored </div> </td> </tr> </tbody></table> <h2 id="tocanch2" class="tvis">The Setup</h2> -<p>Like the SD-80, Roland has discontinued driver support for the SD-20. The SD-20 will not even appear powered on if you choose to power the unit through USB bus power and have no driver installed. The same trick to make SD-80’s driver work on Windows 10 also works for the SD-20. You can search the Internet for the trick, or check out my first post on the SD-80 for the directions.</p> -<p>The module works out of the box on Linux as long as you have proper kernel support (that is, you shouldn’t have to worry about this unless you build the kernel yourself). Required kernel modules are identical to those of the SD-80.</p> -<p>The use of RCA jacks for analog audio output means that I don’t have the suitable cable to connect them to my audio interfaces at the moment. Fortunately I can still make digital recordings thanks to the inclusion of the S/PDIF output. The digital signal has a sample rate of 44100 Hz, the same as SD-80.</p> +<p>Like the SD-80, Roland has discontinued driver support for the SD-20. +The SD-20 will not even appear powered on if you choose to power the +unit through USB bus power and have no driver installed. The same trick +to make SD-80’s driver work on Windows 10 also works for the SD-20. You +can search the Internet for the trick, or check out my first post on the +SD-80 for the directions.</p> +<p>The module works out of the box on Linux as long as you have proper +kernel support (that is, you shouldn’t have to worry about this unless +you build the kernel yourself). Required kernel modules are identical to +those of the SD-80.</p> +<p>The use of RCA jacks for analog audio output means that I don’t have +the suitable cable to connect them to my audio interfaces at the moment. +Fortunately I can still make digital recordings thanks to the inclusion +of the S/PDIF output. The digital signal has a sample rate of 44100 Hz, +the same as SD-80.</p> <h2 id="tocanch3" class="tvis">The Sounds</h2> -<p>(Unless otherwise stated, all hardware demos in this section are recorded through the digital S/PDIF interface with EDIROL UA-25. All files are level normalized to -1 dB. Excerpts are not normalized after being extracted from the normalized original.)</p> +<p>(Unless otherwise stated, all hardware demos in this section are +recorded through the digital S/PDIF interface with EDIROL UA-25. All +files are level normalized to -1 dB. Excerpts are not normalized after +being extracted from the normalized original.)</p> <p>It’s the same StudioCanvas sound, but …</p> -<p>With a few exceptions, preset instruments shared by the SD-20 and the SD-80 sound roughly identical. However, note the different mix levels on each model.</p> +<p>With a few exceptions, preset instruments shared by the SD-20 and the +SD-80 sound roughly identical. However, note the different mix levels on +each model.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -181,12 +231,15 @@ SD-80 <tr> </tr><tr> <td colspan="3"> -Excerpt from AMEDLEY.MID by Earl Gray Fowler from Voyetra Technologies, arranged for SD-80 (Native Mode) +Excerpt from AMEDLEY.MID by Earl Gray Fowler from Voyetra Technologies, +arranged for SD-80 (Native Mode) </td> </tr> </tbody></table> </div> -<p>However significant differences show up as soon as you start tuning any non-GM1 controls (this includes new controls defined by GM2, e.g. cc 74).</p> +<p>However significant differences show up as soon as you start tuning +any non-GM1 controls (this includes new controls defined by GM2, e.g. cc +74).</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -223,7 +276,25 @@ Excerpt from th06_13.mid </tbody></table> </div> <p>Note the very different filter characteristics on the piano.</p> -<p>What make this module nearly unusable is its 64 voices polyphony. Roland has been using this “voice” concept for polyphony since the very beginning of their PCM based synths. An instrument can have up to four “layers” (or “WGs”, wave generators in Roland’s terms) in these Roland PCM synthesizers. Each layer can consist of up to two channels (for stereo samples). Each one of these channels takes up a “voice” when played. The contemporary set and solo set of the StudioCanvas make heavy use of layering, as well as stereo samples. Some of these patches casually use up to 4 voices per note, with a (theoretical) maximum of 8. Unlike the SC-8850 vs SC-8820, when Roland stripped down the polyphony of the SD-20, they did not create simplified patches that use fewer voices like they did for the SC-8820. This immediately brings down the actual note polyphony of the SD-20 down to the same (or even lower) level of SC-55, and is no where near usable. Hence in terms of polyphony, the SD-20 is a downgrade compared to its predecessor SC-8820: Even you have Roland’s (then) latest studio sounds inside a tiny box, you have to take great precaution while using them, as they deplete your available polyphony <em>very</em> fast. Both tracks below demonstrate how 64 voices is nowhere close to enough for the SD-20.</p> +<p>What make this module nearly unusable is its 64 voices polyphony. +Roland has been using this “voice” concept for polyphony since the very +beginning of their PCM based synths. An instrument can have up to four +“layers” (or “WGs”, wave generators in Roland’s terms) in these Roland +PCM synthesizers. Each layer can consist of up to two channels (for +stereo samples). Each one of these channels takes up a “voice” when +played. The contemporary set and solo set of the StudioCanvas make heavy +use of layering, as well as stereo samples. Some of these patches +casually use up to 4 voices per note, with a (theoretical) maximum of 8. +Unlike the SC-8850 vs SC-8820, when Roland stripped down the polyphony +of the SD-20, they did not create simplified patches that use fewer +voices like they did for the SC-8820. This immediately brings down the +actual note polyphony of the SD-20 down to the same (or even lower) +level of SC-55, and is no where near usable. Hence in terms of +polyphony, the SD-20 is a downgrade compared to its predecessor SC-8820: +Even you have Roland’s (then) latest studio sounds inside a tiny box, +you have to take great precaution while using them, as they deplete your +available polyphony <em>very</em> fast. Both tracks below demonstrate +how 64 voices is nowhere close to enough for the SD-20.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -254,13 +325,17 @@ SD-80 <tr> </tr><tr> <td colspan="3"> -“Crude” replica of Septette for a Dead Princess by ZUN. The original tuning was not replicated. +“Crude” replica of Septette for a Dead Princess by ZUN. The original +tuning was not replicated. </td> </tr> </tbody></table> </div> -<p>The SD-20 drops notes like crazy in the final section. The SD-20 MIDI Converter drops percussion notes instead.</p> -<p>Unlike my SD-80, which sometimes messes up timing a bit and slows down when the load is high, the SD-20 simply cut off existing notes instantly without causing timing errors.</p> +<p>The SD-20 drops notes like crazy in the final section. The SD-20 MIDI +Converter drops percussion notes instead.</p> +<p>Unlike my SD-80, which sometimes messes up timing a bit and slows +down when the load is high, the SD-20 simply cut off existing notes +instantly without causing timing errors.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -296,8 +371,12 @@ SD-80 </tr> </tbody></table> </div> -<p>Besides the obvious fact that Loose Lips is missing, pay attention to the way the piano notes are cut short. Also note each model has its own filter response for the synth bass.</p> -<p>Finally, a GM-ish track for comparing vanilla GM2 patches without any tweaking. Reed Romance and SH-2 Lead from the SD special set are used in this adaptation.</p> +<p>Besides the obvious fact that Loose Lips is missing, pay attention to +the way the piano notes are cut short. Also note each model has its own +filter response for the synth bass.</p> +<p>Finally, a GM-ish track for comparing vanilla GM2 patches without any +tweaking. Reed Romance and SH-2 Lead from the SD special set are used in +this adaptation.</p> <div> <table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> <tbody><tr> @@ -328,57 +407,126 @@ SD-80 <tr> </tr><tr> <td colspan="3"> -AMEDLEY.MID by Earl Gray Fowler from Voyetra Technologies, arranged for SD-80 (Native Mode) +AMEDLEY.MID by Earl Gray Fowler from Voyetra Technologies, arranged for +SD-80 (Native Mode) </td> </tr> </tbody></table> </div> -<p>Patches in SD-80’s special set are substituted with patches in the solo set when played with the SD-20 Converter. However hardware SD-20 doesn’t do this substitution and doesn’t produce any sound if a patch from SD-80’s special set is selected, making the last two segments sound like a backing track on the SD-20. The choir in the ballad segment also has a notably shorter release on the hardware SD-20, possibly to mitigate the impact of a reduced polyphony.</p> -<p>The SD-20 MIDI Converter is actually a reasonably good recreation of the SD-20 sounds. That is not saying so much, as the hardware of SD-20 itself is simply not capable of recreate the StudioCanvas sounds very well if the MIDI sequence you feed to it has any complexity to it at all. Sometimes the output from converter is actually closer to the SD-80 than the SD-20, especially if you take parameter response curves into consideration.</p> +<p>Patches in SD-80’s special set are substituted with patches in the +solo set when played with the SD-20 Converter. However hardware SD-20 +doesn’t do this substitution and doesn’t produce any sound if a patch +from SD-80’s special set is selected, making the last two segments sound +like a backing track on the SD-20. The choir in the ballad segment also +has a notably shorter release on the hardware SD-20, possibly to +mitigate the impact of a reduced polyphony.</p> +<p>The SD-20 MIDI Converter is actually a reasonably good recreation of +the SD-20 sounds. That is not saying so much, as the hardware of SD-20 +itself is simply not capable of recreate the StudioCanvas sounds very +well if the MIDI sequence you feed to it has any complexity to it at +all. Sometimes the output from converter is actually closer to the SD-80 +than the SD-20, especially if you take parameter response curves into +consideration.</p> <h2 id="tocanch4" class="tvis">The Editability</h2> <p>It’s virtually nothing compared to the SD-80.</p> -<p>The official SD-20 editor can only tune GM2 parameters. The available parameters are even fewer than the HyperCanvas (HQ-GM2) or TTS-1, mostly because the SD-20 doesn’t expose those parameters at all. As mentioned in my first post on the SD-80, the SD-20 editor is essentially the SD-90 editor with the audio / AFX section removed.</p> +<p>The official SD-20 editor can only tune GM2 parameters. The available +parameters are even fewer than the HyperCanvas (HQ-GM2) or TTS-1, mostly +because the SD-20 doesn’t expose those parameters at all. As mentioned +in my first post on the SD-80, the SD-20 editor is essentially the SD-90 +editor with the audio / AFX section removed.</p> <table> <tbody><tr> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sd20_editor_main.png"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sd20_editor_main.png"></a> <br>SD-20 editor. SD-90 GM2 editor on the right for comparison. +<a href="//filestorage.chrisoft.org/blog/img/sd20_editor_main.png"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sd20_editor_main.png"></a> <br>SD-20 +editor. SD-90 GM2 editor on the right for comparison. </div> </td> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sd20_editor_mixer.png"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sd20_editor_mixer.png"></a> <br>The mixer. It has a very similar layout to the main page of HyperCanvas / TTS-1. +<a href="//filestorage.chrisoft.org/blog/img/sd20_editor_mixer.png"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sd20_editor_mixer.png"></a> <br>The mixer. +It has a very similar layout to the main page of HyperCanvas / TTS-1. </div> </td> </tr> <tr> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sd20_editor_synth.png"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sd20_editor_synth.png"></a> <br>The instrument editor. Only GM2 parameters are exposed. +<a href="//filestorage.chrisoft.org/blog/img/sd20_editor_synth.png"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sd20_editor_synth.png"></a> <br>The +instrument editor. Only GM2 parameters are exposed. </div> </td> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sd20_editor_instp.png"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sd20_editor_instp.png"></a> <br>The instrument picker. The instrument picker of the SD-90 GM2 editor is on the right. +<a href="//filestorage.chrisoft.org/blog/img/sd20_editor_instp.png"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_600x600_sd20_editor_instp.png"></a> <br>The +instrument picker. The instrument picker of the SD-90 GM2 editor is on +the right. </div> </td> </tr> </tbody></table> -<p>The SD-80 editor doesn’t work on the SD-20. Nor does the XV-2020 (which uses the same synth engine as the SD-20) editor. This makes the SD-20 far less editable than the SD-80. Forget about manually piecing together presets on the SD-20 to mimic the SD-80. I don’t even know how to change the samples used by a part on the SD-20 or is it even possible (the MIDI implementation doesn’t mention it).</p> +<p>The SD-80 editor doesn’t work on the SD-20. Nor does the XV-2020 +(which uses the same synth engine as the SD-20) editor. This makes the +SD-20 far less editable than the SD-80. Forget about manually piecing +together presets on the SD-20 to mimic the SD-80. I don’t even know how +to change the samples used by a part on the SD-20 or is it even possible +(the MIDI implementation doesn’t mention it).</p> <h3 id="tocanch5" class="tvis">The Quirks</h3> -<p>The address mapping used by SD-20’s DT1 system exclusive messages is similar to that employed by GS-based Sound Canvas models. Therefore the SD-20 is still somewhat editable, but nowhere close to the level offered by the SD-80. GSAE (GS Advanced Editor) may work with the SD-20, but there could be major compatibility issues.</p> -<p>The SD-20 still responds to GS NRPN messages in native and GM2 mode. SD-90 and SD-80 doesn’t have such behavior.</p> -<p>SD-20 has a special NRPN for selecting sound sets (MSB: <code>0x41</code> LSB: <code>0x00</code>, send set # to value MSB) in GM2 mode. On the SD-90 and SD-80, only system exclusive messages can be used to select sound sets in GM2 mode. The manual mentioned this feature, however it doesn’t tell you which NRPN to use.</p> +<p>The address mapping used by SD-20’s DT1 system exclusive messages is +similar to that employed by GS-based Sound Canvas models. Therefore the +SD-20 is still somewhat editable, but nowhere close to the level offered +by the SD-80. GSAE (GS Advanced Editor) may work with the SD-20, but +there could be major compatibility issues.</p> +<p>The SD-20 still responds to GS NRPN messages in native and GM2 mode. +SD-90 and SD-80 doesn’t have such behavior.</p> +<p>SD-20 has a special NRPN for selecting sound sets (MSB: +<code>0x41</code> LSB: <code>0x00</code>, send set # to value MSB) in +GM2 mode. On the SD-90 and SD-80, only system exclusive messages can be +used to select sound sets in GM2 mode. The manual mentioned this +feature, however it doesn’t tell you which NRPN to use.</p> <h2 id="tocanch6" class="tvis">The Manual</h2> -<p>This really doesn’t deserve its own paragraph, but here it is. Unless otherwise noted, this is referring to the English manual, not the Japanese version (which is somewhat better, but still horrible).</p> -<p>The user manual of Roland products has been criticized for being convoluted, unclear and difficult to navigate through for a long time. The user manual for SD-20 is on a whole new level. It’s an absolute abomination.</p> -<p>To be fair, it’s not like one can write a lot about a product that only have one button and one knob on the front panel. Someone in Roland must have been forced through this …</p> -<p>Content wise, it’s an amalgamation of SD-80’s “owner’s manual” and “quick start guide”. This make the entire thing even more confusing. You can find traces of SD-80’s manual everywhere. Just take a look at the huge gaps in the instrument list and drum set list. That sad drum set table even has a missing border. There’s also the sentence that goes something like this “you can’t edit the sounds in GS mode using the front panel” <a id="n1" href="#note1" class="note">[1]</a>, which is copied straight from SD-80’s manual. Well, duh … you can’t do much editing with one button (which instantly erases all changed parameters when pressed) and one knob in any mode!</p> -<p>Since the SD-20 can only be controlled through MIDI, there would be plenty of information on how to operate the module using MIDI messages in the manual, right? Here Roland took the worst move imaginable and included ZERO information on that in the English manual, not even the system exclusive messages to switch between sound generator modes (the Japanese manual does include this), nor does it include a list of parameters that can be controlled by MIDI. It’s almost like Roland doesn’t want you to learn about the parameters it has at all, unless you read the ultra technical MIDI implementation (which, to make it even better, only has a download for the Japanese version left on the official website. Screw everyone who can’t read Japanese I guess).</p> +<p>This really doesn’t deserve its own paragraph, but here it is. Unless +otherwise noted, this is referring to the English manual, not the +Japanese version (which is somewhat better, but still horrible).</p> +<p>The user manual of Roland products has been criticized for being +convoluted, unclear and difficult to navigate through for a long time. +The user manual for SD-20 is on a whole new level. It’s an absolute +abomination.</p> +<p>To be fair, it’s not like one can write a lot about a product that +only have one button and one knob on the front panel. Someone in Roland +must have been forced through this …</p> +<p>Content wise, it’s an amalgamation of SD-80’s “owner’s manual” and +“quick start guide”. This make the entire thing even more confusing. You +can find traces of SD-80’s manual everywhere. Just take a look at the +huge gaps in the instrument list and drum set list. That sad drum set +table even has a missing border. There’s also the sentence that goes +something like this “you can’t edit the sounds in GS mode using the +front panel” <a id="n1" href="#note1" class="note">[1]</a>, which is copied +straight from SD-80’s manual. Well, duh … you can’t do much editing with +one button (which instantly erases all changed parameters when pressed) +and one knob in any mode!</p> +<p>Since the SD-20 can only be controlled through MIDI, there would be +plenty of information on how to operate the module using MIDI messages +in the manual, right? Here Roland took the worst move imaginable and +included ZERO information on that in the English manual, not even the +system exclusive messages to switch between sound generator modes (the +Japanese manual does include this), nor does it include a list of +parameters that can be controlled by MIDI. It’s almost like Roland +doesn’t want you to learn about the parameters it has at all, unless you +read the ultra technical MIDI implementation (which, to make it even +better, only has a download for the Japanese version left on the +official website. Screw everyone who can’t read Japanese I guess).</p> <h2 id="tocanch7" class="tvis">The Insides</h2> -<p>I spent $100 on this thing mostly because I’m curious about its insides. After testing it out, I don’t have any hope that there’s a chance this thing could have an XV chip inside. Having no screwdrivers did not hinder me even a little bit. I used the scissors in my nail care kit to remove the only 4 screws in the bottom of the module, and one screw holding the board. The board came out without any resistance.</p> +<p>I spent $100 on this thing mostly because I’m curious about its +insides. After testing it out, I don’t have any hope that there’s a +chance this thing could have an XV chip inside. Having no screwdrivers +did not hinder me even a little bit. I used the scissors in my nail care +kit to remove the only 4 screws in the bottom of the module, and one +screw holding the board. The board came out without any resistance.</p> <div style="text-align:center;max-width:90%;"> -<a href="//filestorage.chrisoft.org/blog/img/sd20_board_bottom.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sd20_board_bottom.jpg"></a> <br>No ICs on the bottom side of the board. The scissor used to undo the screws is visible. +<a href="//filestorage.chrisoft.org/blog/img/sd20_board_bottom.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sd20_board_bottom.jpg"></a> <br>No ICs on +the bottom side of the board. The scissor used to undo the screws is +visible. </div> <table> <tbody><tr> @@ -390,44 +538,100 @@ AMEDLEY.MID by Earl Gray Fowler from Voyetra Technologies, arranged for SD-80 (N <td> <div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#ff0000;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_cpu.jpg">CPU (SH7016)</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#ff0000;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_cpu.jpg">CPU +(SH7016)</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#ffa000;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_io.jpg">8bit MCU, I/O Controller</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#ffa000;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_io.jpg">8bit MCU, I/O +Controller</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#fff300;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_cpu.jpg">4 Mb System DRAM</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#fff300;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_cpu.jpg">4 Mb System +DRAM</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#00f300;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_cpu.jpg">16 Mb Flash</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#00f300;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_cpu.jpg">16 Mb +Flash</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#00ffff;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_io.jpg">RS-232 driver</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#00ffff;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_io.jpg">RS-232 +driver</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#00a0ff;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_xp.jpg">Synth DSP (RA0C-003, “XP7”)</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#00a0ff;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_xp.jpg">Synth DSP +(RA0C-003, “XP7”)</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#00c060;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_audioio.jpg">4Mb Effects DRAM</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#00c060;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_audioio.jpg">4Mb +Effects DRAM</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#0000ff;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_wrom.jpg">2 * 128 Mb Wave ROM</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#0000ff;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_wrom.jpg">2 * 128 Mb +Wave ROM</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#a000ff;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_audioio.jpg">Digital Audio Modulator, S/PDIF interface</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#a000ff;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_audioio.jpg">Digital +Audio Modulator, S/PDIF interface</a></p> </div> <div> -<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#ff60ff;margin-right:0.5em;transform: translateY(0.2em);"></x> <a href="//filestorage.chrisoft.org/blog/img/sd20_audioio.jpg">DAC (AK4382A)</a></p> +<p><x style="display:inline-block;width:0.9em;height:0.9em;border:solid 2px #888;background-color:#ff60ff;margin-right:0.5em;transform: translateY(0.2em);"></x> +<a href="//filestorage.chrisoft.org/blog/img/sd20_audioio.jpg">DAC +(AK4382A)</a></p> </div> </div> -Click any IC above for a detailed shot of components around that chip.<br> <a href="//filestorage.chrisoft.org/blog/img/sd20_board_top.jpg">Click here for the whole board shot without the IC markings.</a> +Click any IC above for a detailed shot of components around that +chip.<br> +<a href="//filestorage.chrisoft.org/blog/img/sd20_board_top.jpg">Click +here for the whole board shot without the IC markings.</a> </td> </tr> </tbody></table> -<p>No, it isn’t an XV chip. It’s an XP7 (RA0C-003) chip. This chip is also used by the bottom-of-the-barrel model in the XV line-up, the XV-2020. This is likely the final iteration of the codename XP. The CPU is a SH7016, same as SC-8850 and SC-D70. Other major chips include two 4Mbit EDO DRAM chips (one for CPU and one for XP7), a 16Mbit flash memory for system and parameters, and two 128Mbit Wave ROM chips. The part number and mask ID of the wave ROMs are different from those used by the SD-80 (either in the service manual or my particular module), suggesting they may contain different data.</p> -<p>This is a major let down, sort of speak. The hardware is almost as capable as the XV-2020 (which has a larger CPU RAM and flash memory chip, 16Mbit and 32Mbit respectively). The XP7 is even capable of using 40 types of classical JV/XP insertion effects (MFX), which is not used at all by the SD-20. Maybe the reduced system resources prevented Roland to squeeze the XV-level editability inside.</p> -<p>The XP7 chip runs much hotter compared to the XV chip in the SD-80. It’s almost too hot to touch when the synthesizer load is high. The XP7 chip in the SD-20 is clock much higher than any previous XP chips (33.868 MHz vs 24.576 MHz) to achieve the 44.1 kHz digital output, which is probably the cause of the excessive heat. For a more detailed technical assessment of the chip (and other Roland PCM synth chips), see <a href="https://chrisoft.org/blog/post/2020-11-20.html#tocanch16">my second post on SD-80</a>.</p> -<p>There are 4 unpopulated switch headers on the board. Two are DPDT switches (SW4 and SW2), two seem to be buttons (SW3 and SW5). SW4 and SW5 seem to be electrically connected to the peripherals of the USB controller, SW2 and SW3 seem to be connected to the CPU. One side of SW4 seems to short the USB power. SW2 resets the unit. SW3 puts the unit into an inoperable state (USB indicator turns off, SPIDF output shuts down, does not respond to any key press / MIDI input). SW2 is weird. One side of the upper pole shorts the power to ground. The same side of the lower pole puts the unit into another inoperable state (just like frozen in place). The other side doesn’t do anything consistent. Sometimes the upper pole acts like a perpetual sustain pedal if engaged (no notes are released even after letting the connection go). All of these switches behave the same in test mode and doesn’t seem to affect boot mode selection.</p> +<p>No, it isn’t an XV chip. It’s an XP7 (RA0C-003) chip. This chip is +also used by the bottom-of-the-barrel model in the XV line-up, the +XV-2020. This is likely the final iteration of the codename XP. The CPU +is a SH7016, same as SC-8850 and SC-D70. Other major chips include two +4Mbit EDO DRAM chips (one for CPU and one for XP7), a 16Mbit flash +memory for system and parameters, and two 128Mbit Wave ROM chips. The +part number and mask ID of the wave ROMs are different from those used +by the SD-80 (either in the service manual or my particular module), +suggesting they may contain different data.</p> +<p>This is a major let down, sort of speak. The hardware is almost as +capable as the XV-2020 (which has a larger CPU RAM and flash memory +chip, 16Mbit and 32Mbit respectively). The XP7 is even capable of using +40 types of classical JV/XP insertion effects (MFX), which is not used +at all by the SD-20. Maybe the reduced system resources prevented Roland +to squeeze the XV-level editability inside.</p> +<p>The XP7 chip runs much hotter compared to the XV chip in the SD-80. +It’s almost too hot to touch when the synthesizer load is high. The XP7 +chip in the SD-20 is clock much higher than any previous XP chips +(33.868 MHz vs 24.576 MHz) to achieve the 44.1 kHz digital output, which +is probably the cause of the excessive heat. For a more detailed +technical assessment of the chip (and other Roland PCM synth chips), see +<a href="https://chrisoft.org/blog/post/2020-11-20.html#tocanch16">my +second post on SD-80</a>.</p> +<p>There are 4 unpopulated switch headers on the board. Two are DPDT +switches (SW4 and SW2), two seem to be buttons (SW3 and SW5). SW4 and +SW5 seem to be electrically connected to the peripherals of the USB +controller, SW2 and SW3 seem to be connected to the CPU. One side of SW4 +seems to short the USB power. SW2 resets the unit. SW3 puts the unit +into an inoperable state (USB indicator turns off, SPIDF output shuts +down, does not respond to any key press / MIDI input). SW2 is weird. One +side of the upper pole shorts the power to ground. The same side of the +lower pole puts the unit into another inoperable state (just like frozen +in place). The other side doesn’t do anything consistent. Sometimes the +upper pole acts like a perpetual sustain pedal if engaged (no notes are +released even after letting the connection go). All of these switches +behave the same in test mode and doesn’t seem to affect boot mode +selection.</p> <div class="collapse" data-caption="Incomplete list of integrated circuit chips in the SD-20"> <table> <colgroup> @@ -535,17 +739,20 @@ Click any IC above for a detailed shot of components around that chip.<br> <a hr </tr> <tr class="odd"> <td style="text-align: center;">IC 24</td> -<td style="text-align: center;">Roland R02677490 RA0C-003 JAPAN 0645EGI B0106ZAC</td> +<td style="text-align: center;">Roland R02677490 RA0C-003 JAPAN 0645EGI +B0106ZAC</td> <td style="text-align: center;">ASIC DSP, “XP7” Synth Engine</td> </tr> <tr class="even"> <td style="text-align: center;">IC 26</td> -<td style="text-align: center;">Roland R03010612 23C128BL832J 0620K7002</td> +<td style="text-align: center;">Roland R03010612 23C128BL832J +0620K7002</td> <td style="text-align: center;">128 Mbit Mask ROM, Wave ROM</td> </tr> <tr class="odd"> <td style="text-align: center;">IC 27</td> -<td style="text-align: center;">Roland R03010623 23C128BL833K 0620K7005</td> +<td style="text-align: center;">Roland R03010623 23C128BL833K +0620K7005</td> <td style="text-align: center;">128 Mbit Mask ROM, Wave ROM</td> </tr> <tr class="even"> @@ -555,13 +762,16 @@ Click any IC above for a detailed shot of components around that chip.<br> <a hr </tr> <tr class="odd"> <td style="text-align: center;">IC 29</td> -<td style="text-align: center;">EliteMT M11L416256SA- 35T SZV2C51GR 0627</td> +<td style="text-align: center;">EliteMT M11L416256SA- 35T SZV2C51GR +0627</td> <td style="text-align: center;">EDO DRAM 4 Mbit, XP Effects RAM</td> </tr> <tr class="even"> <td style="text-align: center;">IC 30</td> -<td style="text-align: center;">LH28F160BJE-BTL80 SHARP JAPAN 0631 5 XN</td> -<td style="text-align: center;">Flash Memory, 16 Mbit, System / Parameters</td> +<td style="text-align: center;">LH28F160BJE-BTL80 SHARP JAPAN 0631 5 +XN</td> +<td style="text-align: center;">Flash Memory, 16 Mbit, System / +Parameters</td> </tr> <tr class="odd"> <td style="text-align: center;">IC 31</td> @@ -570,7 +780,8 @@ Click any IC above for a detailed shot of components around that chip.<br> <a hr </tr> <tr class="even"> <td style="text-align: center;">IC 32</td> -<td style="text-align: center;">EliteMT M11L416256SA- 35T SZV2C51GR 0627</td> +<td style="text-align: center;">EliteMT M11L416256SA- 35T SZV2C51GR +0627</td> <td style="text-align: center;">EDO DRAM 4 Mbit, System RAM</td> </tr> <tr class="odd"> @@ -602,13 +813,20 @@ Click any IC above for a detailed shot of components around that chip.<br> <a hr </table> </div> <h2 id="tocanch8" class="tvis">The Secrets</h2> -<p>It seems dead easy to enter the secret test mode on the SD-20 – there’s only one button. Hold the button and turn the power on, the USB indicator will light up. This is the boot mode selection prompt. Release the button. Now you have around 4 seconds to do one of the following:</p> +<p>It seems dead easy to enter the secret test mode on the SD-20 – +there’s only one button. Hold the button and turn the power on, the USB +indicator will light up. This is the boot mode selection prompt. Release +the button. Now you have around 4 seconds to do one of the +following:</p> <ul> <li>Pressing the button twice. The unit will boot into test mode.</li> -<li>Pressing the button three times. The unit will boot into an unknown mode (likely firmware update).</li> +<li>Pressing the button three times. The unit will boot into an unknown +mode (likely firmware update).</li> </ul> -<p>If your action matches none of these, the unit will boot into normal mode.</p> -<p>This section will employ the following notation for the status of the indicator LEDs.</p> +<p>If your action matches none of these, the unit will boot into normal +mode.</p> +<p>This section will employ the following notation for the status of the +indicator LEDs.</p> <pre><code> PWR USB OUTPUT o o o o o o MODE o o o o GM2 G X @@ -617,7 +835,9 @@ o=on -=off *=faint</code></pre> <h3 id="tocanch9" class="tvis">Test mode</h3> -<p>The test mode is far less interesting than that of the SD-80 because I don’t necessarily understand what does every indicators pattern mean.</p> +<p>The test mode is far less interesting than that of the SD-80 because +I don’t necessarily understand what does every indicators pattern +mean.</p> <div class="collapse" data-caption="SD-20 Tests"> <pre><code> test 1 (some sort of version?) PWR USB OUTPUT - - - o @@ -683,22 +903,33 @@ Mode key pressed = next Synthesizer resets again. The module no longer respond to any key presses from this point.</code></pre> </div> -<h3 id="tocanch10" class="tvis">unknown (likely firmware update) mode</h3> +<h3 id="tocanch10" class="tvis">unknown (likely firmware +update) mode</h3> <pre><code> PWR USB OUTPUT o o o o o - MODE o o o * Doesn't respond to any key presses. (long, short, multiple presses) Shows up as a USB device with normal ID (0582:0027). Does not function as synthesizer.</code></pre> <h2 id="tocanch11" class="tvis">The Conclusion</h2> -<p>For a low, low price of $300 in 2002, you get 3 set of mediocre (with a few exceptions) GM2 patches. The sounds themselves are reasonably new and refreshing back then, but the higher average voice-per-note of the new StudioCanvas sounds make the SD-20 a less desirable choice than previous 64-polyphony models. The lack of advanced editing of any sort removes all possibility to explore custom sound design with the module. It’s a cheaply built unit that Roland asked for too much. Even for a Touhou music fanatic today, there are much cheaper ways to get access to the most sought-after instruments.</p> +<p>For a low, low price of $300 in 2002, you get 3 set of mediocre (with +a few exceptions) GM2 patches. The sounds themselves are reasonably new +and refreshing back then, but the higher average voice-per-note of the +new StudioCanvas sounds make the SD-20 a less desirable choice than +previous 64-polyphony models. The lack of advanced editing of any sort +removes all possibility to explore custom sound design with the module. +It’s a cheaply built unit that Roland asked for too much. Even for a +Touhou music fanatic today, there are much cheaper ways to get access to +the most sought-after instruments.</p> <h2 id="tocanch12" class="tvis">The … Death?</h2> -<p>My SD-20 is in temporary coma right now, as it’s receiving a brain surgery …</p> +<p>My SD-20 is in temporary coma right now, as it’s receiving a brain +surgery …</p> <p>I will give updates in a separate post when it’s complete.</p> <table> <tbody><tr> <td> <div style="text-align:center;max-width:98%;"> -<a href="//filestorage.chrisoft.org/blog/img/sd20_wromds.jpg"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sd20_wromds.jpg"></a> <br>I don’t know what I’m doing … +<a href="//filestorage.chrisoft.org/blog/img/sd20_wromds.jpg"><img style="width: 48%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sd20_wromds.jpg"></a> <br>I don’t know +what I’m doing … </div> </td> <td> @@ -710,7 +941,8 @@ The module no longer respond to any key presses from this point.</code></pre> </tbody></table> </article> </div><br><hr> - <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: Had to paraphrase this, because Roland prohibits reproducing contents from their manuals…<br></span></div> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: Had to paraphrase this, because Roland prohibits +reproducing contents from their manuals…<br></span></div> <div id="insanch" style="height:3em;"></div> <div id="footer" style=""> <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> diff --git a/blog/post/2022-11-27.html b/blog/post/2022-11-27.html index 8b16b80..d51225b 100644 --- a/blog/post/2022-11-27.html +++ b/blog/post/2022-11-27.html @@ -35,7 +35,14 @@ function ol() _decryptonload(); } </script> -</head> +<style> +details { + border: 1px solid #888; + border-radius: 4px; + margin: .5em .5em 0; + padding: .5em; +} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -69,20 +76,13 @@ powerful?</a></li><li><a class="toctarg" href="#tocanch30">Since you don’t earn money from you production, …</a></li><li><a class="toctarg" href="#tocanch31">Can I use your music for X?</a></li></ul></li></ul> </li> <li style="margin-left:-0.5em"><a id="prevp" href="2022-07-23.html">Prev post</a></li> - <li style="margin-left:-0.5em"><a id="nextp" href="Privacy.html">Next post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="2023-11-13.html">Next post</a></li> </ul> </div> <div id="content"> <h2 id="titleh" class="TText" style="font-wight:normal;">(Not really) Musical Answers & Rants</h2> <div id="datetags" class="TText" style="margin-bottom:1em;">2022-11-27<br>#music #midi</div> - <hr><div id="article" class="TText"><style> -details { - border: 1px solid #888; - border-radius: 4px; - margin: .5em .5em 0; - padding: .5em; -} -</style> + <hr><div id="article" class="TText"> <article> <p>I’ve got this <a href="https://chrisoft.org/libs/music/player">pretty large music collection</a> on my website and sometimes I get people diff --git a/blog/post/2023-11-13.html b/blog/post/2023-11-13.html index 411fb12..ff85969 100644 --- a/blog/post/2023-11-13.html +++ b/blog/post/2023-11-13.html @@ -54,7 +54,7 @@ battery substitute module installation and upgrades</a></li><li><ul class="tocno laptop</a></li><li><a class="toctarg" href="#tocanch9">Other upgrades</a></li></ul></li></ul> </li> <li style="margin-left:-0.5em"><a id="prevp" href="2022-11-27.html">Prev post</a></li> - <li style="margin-left:-0.5em"><a id="nextp" href="Privacy.html">Next post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="2024-02-02.html">Next post</a></li> </ul> </div> <div id="content"> diff --git a/blog/post/2024-02-02.html b/blog/post/2024-02-02.html new file mode 100644 index 0000000..db66d21 --- /dev/null +++ b/blog/post/2024-02-02.html @@ -0,0 +1,610 @@ +<!DOCTYPE html><html><head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<meta name="theme-color" content="#000000"> +<title>Chrisoft::Blog</title> +<script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> +<script type="text/javascript" src="/blog/footnoter.js"></script> +<script type="text/javascript" src="/blog/aes-js.js"></script> +<script type="text/javascript" src="/blog/scrypt.js"></script> +<script type="text/javascript" src="/blog/sha256.js"></script> +<script type="text/javascript" src="/blog/decryptor.js"></script> +<link rel="stylesheet" type="text/css" href="/common.css"> +<link rel="stylesheet" type="text/css" href="/panel.css"> +<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> +<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b"> +<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a"> +<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b"> +<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a"> +<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b"> +<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a"> +<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b"> +<link rel="stylesheet" type="text/css" href="/blog/blogext.css"> +<script> +function ol() +{ + window.onresize=function() + { + if(window.innerWidth<768) + setupevents(); + else unsetevents(); + } + window.onresize(); + loadTheme(); + _decryptonload(); +} +</script> +<style> +table tr:nth-child(odd) { background-color: rgba(160, 160, 160, 0.3); } +</style></head> +<body onload="ol()" style="overflow-x:hidden;"> + <div id="panel" class="TText"> + <ul id="panellist"> + <li><a href="/"><h1>Chrisoft</h1></a></li> + <li><a href="/blog"><h2>Blog</h2></a></li> + <li><a href="#"><h3 id="title">R-BUS Technical Information</h3></a></li> + <li><span>Tags</span> + <ul id="tagslist"> + <li><a href="/blog/list/music/">music</a></li><li><a href="/blog/list/electronics/">electronics</a></li></ul> + </li> + <li id="tocouter"> + <span>Table of Contents</span> + <ul id="tocroot"> + <li><a class="toctarg" href="#tocanch0">Background</a></li><li><a class="toctarg" href="#tocanch1">Devices with R-BUS support</a></li><li><a class="toctarg" href="#tocanch2">Pin definition</a></li><li><a class="toctarg" href="#tocanch3">Official cable wiring</a></li><li><a class="toctarg" href="#tocanch4">Electrical +characteristics of the interface</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch5">Power</a></li><li><a class="toctarg" href="#tocanch6">Digital Audio</a></li><li><a class="toctarg" href="#tocanch7">MIDI</a></li></ul></li></ul> + </li> + <li style="margin-left:-0.5em"><a id="prevp" href="2023-11-13.html">Prev post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="2024-02-04.html">Next post</a></li> + </ul> + </div> + <div id="content"> + <h2 id="titleh" class="TText" style="font-wight:normal;">R-BUS Technical Information</h2> + <div id="datetags" class="TText" style="margin-bottom:1em;">2024-02-02<br>#music #electronics</div> + <hr><div id="article" class="TText"> +<article> +<h2 id="tocanch0" class="tvis">Background</h2> +<p>R-BUS (also called RMDB2 / RMDB II on older products) is an obsolete +proprietary interconnect format that carries bidirectional MIDI and +digital audio data created by Roland. It was used on Roland products +released from the late 90s to early 2000s.</p> +<p>There was a physically incompatible and much rarer predecessor of +R-BUS called RMDB (Roland Multipurpose Digital Bus). RMDB is not the +subject of this article.</p> +<p>Much of the information here is gathered from schematics inside +service manuals for various Roland products, mainly the XV-5080 and +VS-2400. These can be easily found with a search through the +interwebz.</p> +<p>This article assumes minimal electronics knowledge from the reader. +As a matter of fact, the author is also a layperson in this space. +Report of any issues in the article would be appreciated.</p> +<p>For other R-BUS related stuff on this website, please visit <a href="/rbusif">this page</a>.</p> +<h2 id="tocanch1" class="tvis">Devices with R-BUS support</h2> +<p>Here is a not necessarily complete list of Roland products that comes +with at least one R-BUS connector:</p> +<ul> +<li>Mixing Console +<ul> +<li>VM-3100Pro</li> +<li>VM-7100 / VM-7200 (3 ports on optional VM-24E I/O expansion)</li> +</ul></li> +<li>Studio Workstation +<ul> +<li>VS-2400</li> +<li>VS-2480 (2 ports)</li> +<li>VSR-880</li> +</ul></li> +<li>Production Studio +<ul> +<li>MV-8000 / MV-8800 (available through the MV8-OP1 audio I/O +expansion)</li> +</ul></li> +<li>Synthesizer +<ul> +<li>XV-5080 (output only)</li> +</ul></li> +<li>Interface Modules +<ul> +<li>RPC-1 (Conventional PCI R-BUS interface)</li> +<li>ADA-7000 (A/D converter)</li> +<li>AE-7000 (R-BUS <=> AES/EBU converter)</li> +<li>DIF-AT (R-BUS <=> TDIF & ADAT converter)</li> +<li>DIF-AT24 (R-BUS to ADAT and MIDI interface, 24-bit)</li> +</ul></li> +</ul> +<h2 id="tocanch2" class="tvis">Pin definition</h2> +<p>Connection for VS-2400 and XV-5080 is extracted from their respective +service manuals. Pin usage inferred from these connections.</p> +<table> +<colgroup> +<col style="width: 13%"> +<col style="width: 31%"> +<col style="width: 31%"> +<col style="width: 22%"> +</colgroup> +<thead> +<tr class="header"> +<th style="text-align: center;">PIN</th> +<th style="text-align: center;">VS-2400</th> +<th style="text-align: center;">XV-5080</th> +<th style="text-align: left;">Usage</th> +</tr> +</thead> +<tbody> +<tr class="odd"> +<td style="text-align: center;">1</td> +<td style="text-align: center;">+5V</td> +<td style="text-align: center;">+5V</td> +<td style="text-align: left;">Power output</td> +</tr> +<tr class="even"> +<td style="text-align: center;">2</td> +<td style="text-align: center;">RBOUT11</td> +<td style="text-align: center;">SDO4</td> +<td style="text-align: left;">Channel 1/2 output (<span style="text-decoration: overline;">SDOUT1</span><a id="n1" href="#note1" class="note">[1]</a>)</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">3</td> +<td style="text-align: center;">RBOUT12</td> +<td style="text-align: center;">SDO5</td> +<td style="text-align: left;">Channel 3/4 output (<span style="text-decoration: overline;">SDOUT2</span>)</td> +</tr> +<tr class="even"> +<td style="text-align: center;">4</td> +<td style="text-align: center;">RBOUT13</td> +<td style="text-align: center;">SDO6</td> +<td style="text-align: left;">Channel 5/6 output (<span style="text-decoration: overline;">SDOUT3</span>)</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">5</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="even"> +<td style="text-align: center;">6</td> +<td style="text-align: center;">RBOUT14</td> +<td style="text-align: center;">SDO7</td> +<td style="text-align: left;">Channel 7/8 output (<span style="text-decoration: overline;">SDOUT4</span>)</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">7</td> +<td style="text-align: center;">NC <a id="n2" href="#note2" class="note">[2]</a></td> +<td style="text-align: center;">NC</td> +<td style="text-align: left;">Unused?</td> +</tr> +<tr class="even"> +<td style="text-align: center;">8</td> +<td style="text-align: center;">RBIN14</td> +<td style="text-align: center;">NC</td> +<td style="text-align: left;">Channel 7/8 input (<span style="text-decoration: overline;">SDIN4</span>)</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">9</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="even"> +<td style="text-align: center;">10</td> +<td style="text-align: center;">RBIN13</td> +<td style="text-align: center;">NC</td> +<td style="text-align: left;">Channel 5/6 input (<span style="text-decoration: overline;">SDIN3</span>)</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">11</td> +<td style="text-align: center;">RBIN12</td> +<td style="text-align: center;">NC</td> +<td style="text-align: left;">Channel 3/4 input (<span style="text-decoration: overline;">SDIN2</span>)</td> +</tr> +<tr class="even"> +<td style="text-align: center;">12</td> +<td style="text-align: center;">RBIN11</td> +<td style="text-align: center;">SDI2</td> +<td style="text-align: left;">Channel 1/2 input (<span style="text-decoration: overline;">SDIN1</span>)</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">13</td> +<td style="text-align: center;">NC</td> +<td style="text-align: center;">NC</td> +<td style="text-align: left;">Power reception for bus-powered devices +<a id="n3" href="#note3" class="note">[3]</a></td> +</tr> +<tr class="even"> +<td style="text-align: center;">14</td> +<td style="text-align: center;">PC_TXD1</td> +<td style="text-align: center;">RBUS_TX</td> +<td style="text-align: left;">MIDI transmit <a id="n4" href="#note4" class="note">[4]</a></td> +</tr> +<tr class="odd"> +<td style="text-align: center;">15</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="even"> +<td style="text-align: center;">16</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">17</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="even"> +<td style="text-align: center;">18</td> +<td style="text-align: center;">1FS</td> +<td style="text-align: center;">LRCK4</td> +<td style="text-align: left;">Frame sync (word clock) output</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">19</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="even"> +<td style="text-align: center;">20</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">21</td> +<td style="text-align: center;">RBFS1</td> +<td style="text-align: center;">RBUS-WDCLK</td> +<td style="text-align: left;">Frame sync (word clock) input</td> +</tr> +<tr class="even"> +<td style="text-align: center;">22</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">23</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="even"> +<td style="text-align: center;">24</td> +<td style="text-align: center;">GND</td> +<td style="text-align: center;">GND</td> +<td style="text-align: left;">Ground</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">25</td> +<td style="text-align: center;">PC_RXD1</td> +<td style="text-align: center;">RBUS_RX</td> +<td style="text-align: left;">MIDI receive <a id="n5" href="#note5" class="note">[5]</a></td> +</tr> +</tbody> +</table> +<h2 id="tocanch3" class="tvis">Official cable wiring</h2> +<p>Roland has only disclosed partial information on the wiring scheme +used by the official R-BUS cables. <a id="n6" href="#note6" class="note">[6]</a> +However, it’s rather easy to infer the full wiring scheme from that +information. This has been confirmed by other third-party sources. +<a id="n7" href="#note7" class="note">[7]</a> <a id="n8" href="#note8" class="note">[8]</a></p> +<table> +<colgroup> +<col style="width: 25%"> +<col style="width: 18%"> +<col style="width: 11%"> +<col style="width: 18%"> +<col style="width: 25%"> +</colgroup> +<thead> +<tr class="header"> +<th style="text-align: right;">Usage 🖙</th> +<th style="text-align: center;">Pin on one side</th> +<th style="text-align: center;">is connected to</th> +<th style="text-align: center;">Pin on the other side</th> +<th style="text-align: left;">🖘 Usage</th> +</tr> +</thead> +<tbody> +<tr class="odd"> +<td style="text-align: right;">+5V</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">13</td> +<td style="text-align: left;">+5V In</td> +</tr> +<tr class="even"> +<td style="text-align: right;">SDOUT1</td> +<td style="text-align: center;">2</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">12</td> +<td style="text-align: left;">SDIN1</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">SDOUT2</td> +<td style="text-align: center;">3</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">11</td> +<td style="text-align: left;">SDIN2</td> +</tr> +<tr class="even"> +<td style="text-align: right;">SDOUT3</td> +<td style="text-align: center;">4</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">10</td> +<td style="text-align: left;">SDIN3</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">5</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">9</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="even"> +<td style="text-align: right;">SDOUT4</td> +<td style="text-align: center;">6</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">8</td> +<td style="text-align: left;">SDIN4</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">NC</td> +<td style="text-align: center;">7</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">7</td> +<td style="text-align: left;">NC</td> +</tr> +<tr class="even"> +<td style="text-align: right;">SDIN4</td> +<td style="text-align: center;">8</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">6</td> +<td style="text-align: left;">SDOUT4</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">9</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">5</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="even"> +<td style="text-align: right;">SDIN3</td> +<td style="text-align: center;">10</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">4</td> +<td style="text-align: left;">SDOUT3</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">SDIN2</td> +<td style="text-align: center;">11</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">3</td> +<td style="text-align: left;">SDOUT2</td> +</tr> +<tr class="even"> +<td style="text-align: right;">SDIN1</td> +<td style="text-align: center;">12</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">2</td> +<td style="text-align: left;">SDIN1</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">+5V In</td> +<td style="text-align: center;">13</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">1</td> +<td style="text-align: left;">+5V</td> +</tr> +<tr class="even"> +<td style="text-align: right;">MIDI TX</td> +<td style="text-align: center;">14</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">25</td> +<td style="text-align: left;">MIDI RX</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">15</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">24</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="even"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">16</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">23</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">17</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">22</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="even"> +<td style="text-align: right;">FS Out</td> +<td style="text-align: center;">18</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">21</td> +<td style="text-align: left;">FS In</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">19</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">20</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="even"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">20</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">19</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">FS In</td> +<td style="text-align: center;">21</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">18</td> +<td style="text-align: left;">FS Out</td> +</tr> +<tr class="even"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">22</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">17</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">23</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">16</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="even"> +<td style="text-align: right;">GND</td> +<td style="text-align: center;">24</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">15</td> +<td style="text-align: left;">GND</td> +</tr> +<tr class="odd"> +<td style="text-align: right;">MIDI RX</td> +<td style="text-align: center;">25</td> +<td style="text-align: center;"></td> +<td style="text-align: center;">14</td> +<td style="text-align: left;">MIDI TX</td> +</tr> +</tbody> +</table> +<h2 id="tocanch4" class="tvis">Electrical +characteristics of the interface</h2> +<h3 id="tocanch5" class="tvis">Power</h3> +<p>The +5V supply is derived straight from the +5V rail that goes into +the main board, with polarity protection (both in the XV-5080 and +VS-2400) provided with a Schottky diode, and sometimes a current +protected with a thermistor (not present in the XV-5080).</p> +<p>The +5V pin measured 5.28V to ground on my XV-5080.</p> +<h3 id="tocanch6" class="tvis">Digital Audio</h3> +<p>The format of digital audio portion of R-BUS resembles <a href="https://en.wikipedia.org/wiki/I%C2%B2S">I²S</a>, but with a few +key differences:</p> +<ul> +<li>There’s no bit clock.</li> +<li>Sample data are transmitted as if they are 32-bit, despite only the +first 24-bit is being used.</li> +<li>Logic level on the data line is inverted.</li> +</ul> +<p>To give a standalone description of the R-BUS digital audio +protocol:</p> +<ul> +<li>The frame sync (word clock) signal runs at the same frequency as the +sampling rate.</li> +<li>When frame sync is low, left channel of each channel pair is being +transmitted, otherwise right channel is being transmitted.</li> +<li>Each half cycle of the frame sync clock is divided into 32 periods, +during each of which a bit of sample data is sent on every serial data +line.</li> +<li>Sample data are sent most significant bit (MSB) first. Each sample +is 24-bit long, leaving 8 bits unused at the end of each half cycle of +frame sync.</li> +<li>Logic low on the data line means the bit being sent is 1, and high +means it’s a 0.</li> +</ul> +<p>If you’d like a timing diagram of all this, please look up the +datasheet of TC9271 made by Toshiba (used in the XV-5080 as its S/PDIF +encoder chip). Figure 1b is a good representation of the relationship +between frame sync (LRCK in the datasheet) and audio data. The LRS=H +case in figure 3a shows how the frame sync signal sent over R-BUS should +be interpreted.</p> +<p>There are 4 serial data lines in each direction, giving the 8 +channels in total for each direction. Each direction has its own frame +sync signal, which is shared among all data lines in that direction.</p> +<h3 id="tocanch7" class="tvis">MIDI</h3> +<p>What is sent over the MIDI wires in the R-BUS cable has not been +confirmed by me.</p> +<p>The MIDI interface is used differently on different Roland +products:</p> +<ul> +<li>XV-5080 seem to ignore everything on the R-BUS MIDI interface, +despite having all the facilities to handle it. Roland disclosed this in +RPC-1’s user manual (see the section on XV-5080). I have not tested this +claim.</li> +<li>MV-8000 series with MV8-OP1 installed can use the R-BUS MIDI output +as a separate MIDI port. Data going into the R-BUS MIDI port will be +mixed with the built-in MIDI input.</li> +<li>VM-3100Pro can pass through the MIDI data to its built-in MIDI +ports, and can control the host sequencer if connected to a +computer.</li> +<li>V-Studio products can receive MIDI clock over R-BUS.</li> +<li>Any aspects / products not mentioned here are unknown to me.</li> +</ul> +<p>Roland calls the signals that go in to / out of these pins “IPC” or +“PC”. <a id="n9" href="#note9" class="note">[9]</a></p> +<p>Inside both the VS-2400 and the XV-5080, the signal is generated / +goes into a dedicated microcontroller (a M3888 1M2), specifically, a +pair of its UART ports. An inverter is between the R-BUS connector and +the MCU in each direction of the signal.</p> +<p>Roland claims in VS-2480’s manual that R-BUS carries 8 channels of +bidirectional digital audio (which are already fully accounted for in +the previous section), plus MIDI, MMC (MIDI Machine Control) and MTC +(MIDI Timecode).</p> +<p>The factual portion of this section ends here. Everything below is my +guesswork. Since MMC commands and MTC are both usually just sent as +normal MIDI messages, it’s a reasonable assumption that, the only thing +that is transmitted over these wires is MIDI, which is also why I named +them MIDI TX/RX in my pin usage chart.</p> +<p>Since MIDI is pretty much just UART with a bit of isolation, I would +venture a guess that the signal sent / expected on these two pins is +just inverted MIDI UART signal.</p> +<p>It would be pretty trivial to build some experimental circuitry to +test my theory. Maybe I’ll do it one day. However this may end up with +nothing – as the XV-5080 will probably just ignore the MIDI data going +through R-BUS.</p> +</article> +</div><br><hr> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: Serial data +output (input). Overline indicates that 1-bit is represented with low +logic level and 0-bit with high logic level. Same +below.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: Not connected. Same +below.<br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: Inferred from wiring scheme<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: Often abbreviated +as TX.<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: Often abbreviated +as RX.<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: <a href="https://support.roland.com/hc/en-us/articles/201978779-R-BUS-RBUS-RBC-RBC-5-Where-Can-I-Find-an-R-BUS-Cable">R-BUS, +RBUS, RBC, RBC-5: Where Can I Find an R-BUS Cable?</a><br></span><span class="TText"><a id="note7" href="#n7">[7]</a>: <a href="https://web.archive.org/web/20240204170917/https://www.vsplanet.com/ubbthreads/ubbthreads.php?ubb=showflat&Number=450346">Roll +your own: R-Bus Cable Pin Out.</a><br></span><span class="TText"><a id="note8" href="#n8">[8]</a>: <a href="https://web.archive.org/web/20211204221550/https://themidimaniac.com/diy-r-bus-cable-for-20e/">DIY +R-BUS cable for 20€</a><br></span><span class="TText"><a id="note9" href="#n9">[9]</a>: I have no idea what these could mean. My +software-dominated brain tells me they stand for “Inter-Process +Communication” and “Program Counter” but they clearly stand for +something else here.<br></span></div> + <div id="insanch" style="height:3em;"></div> + <div id="footer" style=""> + <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> + <div style="text-align:center;" class="TText"> + Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5 + <br> + Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span> + </div> + </div> + <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;"> + </div> + </div> + <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;"> + <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);"> + <div id="keyhint" style="margin-bottom:8px;"></div> + <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div> + <div style="height:2.25em;"> + <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button> + <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button> + </div> + + </div> + + +</div></body></html>
\ No newline at end of file diff --git a/blog/post/2024-02-04.html b/blog/post/2024-02-04.html new file mode 100644 index 0000000..e07cf56 --- /dev/null +++ b/blog/post/2024-02-04.html @@ -0,0 +1,594 @@ +<!DOCTYPE html><html><head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<meta name="theme-color" content="#000000"> +<title>Chrisoft::Blog</title> +<script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> +<script type="text/javascript" src="/blog/footnoter.js"></script> +<script type="text/javascript" src="/blog/aes-js.js"></script> +<script type="text/javascript" src="/blog/scrypt.js"></script> +<script type="text/javascript" src="/blog/sha256.js"></script> +<script type="text/javascript" src="/blog/decryptor.js"></script> +<link rel="stylesheet" type="text/css" href="/common.css"> +<link rel="stylesheet" type="text/css" href="/panel.css"> +<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> +<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b"> +<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a"> +<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b"> +<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a"> +<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b"> +<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a"> +<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b"> +<link rel="stylesheet" type="text/css" href="/blog/blogext.css"> +<script> +function ol() +{ + window.onresize=function() + { + if(window.innerWidth<768) + setupevents(); + else unsetevents(); + } + window.onresize(); + loadTheme(); + _decryptonload(); +} +</script> +</head> +<body onload="ol()" style="overflow-x:hidden;"> + <div id="panel" class="TText"> + <ul id="panellist"> + <li><a href="/"><h1>Chrisoft</h1></a></li> + <li><a href="/blog"><h2>Blog</h2></a></li> + <li><a href="#"><h3 id="title">RBUS-ADAT devlog</h3></a></li> + <li><span>Tags</span> + <ul id="tagslist"> + <li><a href="/blog/list/music/">music</a></li><li><a href="/blog/list/electronics/">electronics</a></li></ul> + </li> + <li id="tocouter"> + <span>Table of Contents</span> + <ul id="tocroot"> + <li><a class="toctarg" href="#tocanch0">Origins</a></li><li><a class="toctarg" href="#tocanch1">Background check on the chip</a></li><li><a class="toctarg" href="#tocanch2">Ill-fated commencement</a></li><li><a class="toctarg" href="#tocanch3">Designing the board</a></li><li><a class="toctarg" href="#tocanch4">Board production and final +assembly</a></li><li><a class="toctarg" href="#tocanch5">Full project timeline</a></li><li><a class="toctarg" href="#tocanch6">Full material cost</a></li><li><a class="toctarg" href="#tocanch7">Potential future work</a></li><li><a class="toctarg" href="#tocanch8">I want one! What should I do?</a></li><li><a class="toctarg" href="#tocanch9">You’re an idiot and +your design is trash!</a></li></ul> + </li> + <li style="margin-left:-0.5em"><a id="prevp" href="2024-02-02.html">Prev post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="Privacy.html">Next post</a></li> + </ul> + </div> + <div id="content"> + <h2 id="titleh" class="TText" style="font-wight:normal;">RBUS-ADAT devlog</h2> + <div id="datetags" class="TText" style="margin-bottom:1em;">2024-02-04<br>#music #electronics</div> + <hr><div id="article" class="TText"><article> +<h2 id="tocanch0" class="tvis">Origins</h2> +<p>Funny enough, the origins of this project has nothing to do with +R-BUS <strong>or</strong> ADAT.</p> +<p>Ideas to build a digital only version of the EDIROL SD-80 surfaced in +early 2023 as an extension to my SD-80 modding plan. Beacuse my SD-80 is +half broken (headphone amp on analog output 1 fried due to my stupidity, +see my <a href="https://chrisoft.org/blog/post/2020-11-20.html#tocanch2">second +SD-80 post</a> for how it happened) and I only ever record it through +its digital outputs anyway, I believe I can drastically reduce the +footprint of it by taking out all the analog outputs and removing the +now unused ±15V rail, making the device USB bus powered at the same +time. There was also plans to add a second digital output to the modded +SD-80, however the plan was never finalized, let alone implemented +because of my lack of proper electronics knowledge and soldering skills. +The idea was therefore shelved.</p> +<p>Meanwhile in early 2022, I acquired a Roland XV-5080 (which I still +have a long overdue review to write). I was also only recording that +thing digitally and sometimes felt that wasting the other 3 stereo +outputs is a shame. I did a bit of research and apparently the R-BUS +port on its back outputs all 4 stereo outputs of the synth. Later I +found out there was the DIF-AT and DIF-AT24 that can convert R-BUS to +ADAT which is still fairly common on modern audio interfaces. However +for a small box that doesn’t really do much, asking price for the DIF-AT +is absolutely crazy – every single listing I saw was ~$200. And the +DIF-AT24, which supports 24-bit ADAT output (in contrast to DIF-AT’s +20-bit output), is pretty much unobtainium. So I decided to live with +recording through its S/PDIF output for the time being.</p> +<p>In September 2023, by pure coincidence, I found a listing on ebay of +a chip described as “ADAT optical encoder/generator”, which was the <a href="https://www.coolaudio.com/docs/COOLAUDIO_V1401_DATASHEET.pdf">coolaudio +V1401</a> that later would become the heart of my design. After reading +its datasheet I decided it would pretty much make my SD-80 digital mod +trivial, with the added benefit of carrying both stereo output channels +on a single port. So I opened up the service manual for SD-80 and +started to study which pin each signal should go to. However I quickly +realized that performing the mod would require soldering around the XV +chip inside the SD-80, which is still a thing that I’m not really +willing to do; and that I could easily test out my theory on XV-5080’s +R-BUS port because the digital audio output pins on XV-5080’s R-BUS port +is pretty much directly connected to the XV chip through an +inverter.</p> +<p>To summerize … I came up with a solution for a problem that I made up +for myself.</p> +<h2 id="tocanch1" class="tvis">Background check on the chip</h2> +<p>The seller of the chip claims the chip is an equivalent of the AL1401 +from Alesis, which sounds quite interesting as Alesis is actually the +company behind ADAT (<u>Alesis</u> Digital Audio Tape, as for why it’s a +tape not a optical interface… that’s a story for another time). +Suspicion that this chip is a Chinese clone arose. So I did a bit of +background on the company … <a id="n1" href="#note1" class="note">[1]</a></p> +<p>Turns out, of course it is. While its roots can be traced to the US +in the 90s, design team of coolaudio is now located in China +<a id="n2" href="#note2" class="note">[2]</a>. Better still, it’s a brand +of Music Tribe, which is Uli Behringer’s company. Yes it’s the same +person who founded Behringer which is best known as the legal (/s) clone +audio equipment manufacturer. <del>No wonder why coolaudio’s product +portfolio is all clone chips.</del></p> +<p>Well, the original AL1401 is pretty much impossible to find nowadays, +so I really have no choice don’t I?</p> +<h2 id="tocanch2" class="tvis">Ill-fated commencement</h2> +<p>I ordered the V1401 chips before my end-of-year vacation travel. When +I returned from my vacation, I found these in my mail box:</p> +<div style="text-align:center;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-pk.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-pk.jpg"></a><br>Suspicious packets +</div> +<p>which may look suspicious to law enforcement… but they are actually +just chips. Not the edible kind.</p> +<p>My prior experience with electronics is only limited to reading +schematics and disassembling (and destroying in the process) hundreds of +home appliances. So I guess I have seen hundreds of printed circuit +boards but I haven’t ever made or designed one of my own. I did take a +class during my undergrad that involved programming FPGAs, which did +have a “drawing schematics on a computer” component to it, but that +didn’t have anything to do with PCB design.</p> +<p>Since I do not have any prior experience working with EDA software, I +toyed with an Chinese online EDA toolkit that literally has “easy” in +its name (EasyEDA) and drew a tentative schematic for the supporting +components. Apparently it wasn’t that different from what I used when I +was taking the FPGA class, but at this stage I still haven’t confirmed +many aspects of the characteristics of R-BUS yet. As a result there were +a multitude of issues with this schematic. However it did help me come +up with a list of components (“bill of materials” in more professional +terms) needed for the project. I ordered these together with some +prototyping supplies online, hoping to actually build a prototype once +they have arrived.</p> +<div style="text-align:center;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-es.png"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-es.png"></a> <br>The error-riddled +schematic +</div> +<p>I need an audio interface with ADAT inputs because none of the bunch +I already own has one. Since the Scarlett 18i8 3rd gen was on sale for +$360 at the time, I decided to get one.</p> +<p>When I was reviewing the datasheet for the components I ordered +<a id="n3" href="#note3" class="note">[3]</a>, I +found out that I’ve ordered the wrong optical transmitter. The part I +ordered was TOTX1353 which only supports up to 500 kb/s data rate … less +than 1/20 required by an ADAT data stream. However for some stupid +reason that I couldn’t recall, I decided to try prototyping with it +anyway.</p> +<p>I soldered one of the V1401 chips to the SOIC carrier board. As this +time I used plenty of proper, good quality flux as suggested the MacBook +repair guy Louis Rossmann <a id="n4" href="#note4" class="note">[4]</a>, the result didn’t look +nearly as bad as my previous SMD soldering attempts and I was quite +happy with it.</p> +<p>On the following day I started showing mild symptoms of a common +cold. Later that night a fever kicked in. The next day I decided to use +an expired Cornweed <a id="n5" href="#note5" class="note">[5]</a> test kit on myself and found out Cornweed was +growing inside me (hence the name of this subsection).</p> +<p>I got a week off from my workplace to get rid of the Cornweed. Since +I already felt much better after one day, I started breadboarding. It +was finished pretty quickly. But soon after that I found out there was +more than one thing wrong with the optical transmitter module I chose – +the module doesn’t have a drive circuitry built in and it pretty much +just a bare LED. There is no way in hell that it can be directly driven +from the output of a 74LS04. The LED in the transmitter only barely +lights up when the output is active. At this point I finally realized +that I can’t use this out of spec piece of crap in the final design +anyway, so I placed order for a few transmitters that are more fit for +the job.</p> +<table> +<tbody><tr> +<td> +<div style="text-align:center;max-width:98%;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-bo.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-bo.jpg"></a> <br>The chip on its +breakout board +</div> +</td> +<td> +<div style="text-align:center;max-width:98%;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-b0.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-b0.jpg"></a> <br>The breadboard +prototype before it was working +</div> +</td> +</tr> +</tbody></table> +<p>When I was trying to wire in the DB-25 terminal block, I found out +that I don’t have the proper flathead driver for the screws. So I had to +get one of those as well.</p> +<p>Once I really had all the items I need, I started putting things +together. The process was fairly easy but the audio interface didn’t see +the ADAT signal on the first attempt. I double checked all the +breadboard connections and inputs to the chip, which appeared to be all +correct. Feeling tired, I removed the prototype from my desk to work on +it the following day, unplugging all the cables in the process.</p> +<p>To my utter surprise, the thing straight up worked when I plugged it +in on the next day. It turns out that the port on the new transmitter is +very tight and takes quite a bit of force to insert the plug all the way +in.</p> +<div style="text-align:center;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-b1.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-b1.jpg"></a><br>Working prototype! +</div> +<h2 id="tocanch3" class="tvis">Designing the board</h2> +<p>I decided to switch to KiCad soon after I started the actual +prototyping process, probably due to my bias towards free software.</p> +<p>Drawing the schematics wasn’t hard. Although I did have to read the +manuals to find out how buses work in KiCad.</p> +<p>There is no symbol for the V1401 chip in KiCad’s default library, and +no symbol or footprint for the optical transmitter. I had to learn how +to draw these and make them myself. Fortunately the process is pretty +straightforward and the datasheet has everything I need.</p> +<p>I spent some additional time studying the digital / analog audio +output section of XV-5080 to find out the format of digital audio data +coming out of the XV chip. Once that was done I was able finalize the +schematic. I started learning routing in KiCad soon after that. However +that effort was put on hold as soon as I realized I should really +validate the schematic on breadboard first.</p> +<p>Once I got the breadboard version working, I started working on +routing the board again. It started pretty difficult, as certain +crossings couldn’t really be avoided. However once I started making +liberal use of vias the problems got solved pretty quickly. I then +recalled seeing large ground plane on most circuit boards that I’ve laid +my eyes on and found out those can be made in KiCad with “zones”. +However for some (not completely insane, but still pretty stupid) reason +I thought adding too much copper could add to the manufacturing cost, so +I was … quite stingy with the zones. Maybe I should fix it in the next +revision.</p> +<p>Finally I added some personal markings on the board. I decided to try +the svg import feature of KiCad and drew something in Inkscape within a +minute. Once placed on the board it actually looked pretty nice. Yes it +is a Touhou reference, now stop asking why.</p> +<table> +<tbody><tr> +<td> +<div style="text-align:center;max-width:98%;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-ks.png"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-ks.png"></a> <br>Unfinished +schematic in KiCad +</div> +</td> +<td> +<div style="text-align:center;max-width:98%;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-rt.png"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-rt.png"></a> <br>First attempt at +routing. The board was laid out very differently. +</div> +</td> +</tr> +</tbody></table> +<h2 id="tocanch4" class="tvis">Board production and final +assembly</h2> +<p>The design was now ready and I started looking for PCB manufacturers. +I settled between a few Chinese manufacturing providers for price +considerations. My final manufacturer of choice was JLCPCB, mostly +because they have the best reviews in China. I submitted the files and +waited anxiously for the boards to arrive.</p> +<p>The boards arrived astonishingly fast. In just 5 days it went through +the entire production sequence as well as the Pacific Ocean, and arrived +at my door steps. I test fit all the components, which all fit just +fine. Next was the final assembly which also went pretty smoothly. After +a quick test the board was found to work perfectly. I was actually +shocked that the very first PCB designed by me worked first try. To be +fair the board itself is pretty simple. It was figuring out the R-BUS +protocol that made the project slightly tricky. Actually I’m pretty +surprised to find out that nobody has done the work already given the +service manual of XV-5080 has been floating around on the Internet for +many years now. Anyway, this has been a fantastic starter electronics +project for me and the process has been quite enjoyable.</p> +<table> +<tbody><tr> +<td> +<div style="text-align:center;max-width:98%;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-pp.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-pp.jpg"></a> <br>Box from JLCPCB +</div> +</td> +<td> +<div style="text-align:center;max-width:98%;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-bs.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-bs.jpg"></a> <br>It’s between my +fingers… +</div> +</td> +</tr> +<tr> +<td> +<div style="text-align:center;max-width:98%;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-pa.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-pa.jpg"></a> <br>First two +components installed +</div> +</td> +<td> +<div style="text-align:center;max-width:98%;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-fp.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-fp.jpg"></a> <br>Assembly finished +</div> +</td> +</tr> +</tbody></table> +<div style="text-align:center;"> +<a href="//filestorage.chrisoft.org/blog/img/rbdt-pw.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1024x1024_rbdt-pw.jpg"></a><br>IT’S ALIVE!! +</div> +<h2 id="tocanch5" class="tvis">Full project timeline</h2> +<ul> +<li>2023-09-27: V1401 chip found on ebay.</li> +<li>2023-12-09: V1401 chips bought from ebay seller.</li> +<li>2024-01-10: Schematic attempt with EasyEDA.</li> +<li>2024-01-11: First batch of components ordered.</li> +<li>2024-01-17: V1401 soldered to breadboard adapter.</li> +<li>2024-01-18: Second batch of components ordered.</li> +<li>2024-01-20: Switched to KiCad. Schematic finished except missing +symbol and footprint for optical transmitter.</li> +<li>2024-01-21: Breadboard built. Created symbols and footprint for +optical transmitter in KiCad.</li> +<li>2024-01-22: Started learning PCB layout in KiCad. First attempt to +route the PCB made. Routing halted later that day.</li> +<li>2024-01-26: First working breadboard prototype. Routing resumed and +finished the same day. Learned how to use zones in KiCad. PCB design +revised.</li> +<li>2024-01-27: PCB submitted to JLCPCB for production. 10 boards +ordered.</li> +<li>2024-02-01: PCB arrived. First board assembled and passed +testing.</li> +</ul> +<h2 id="tocanch6" class="tvis">Full material cost</h2> +<p>This includes all orders placed specifically for this project, +including stuff that can be later used for other purposes. Prices listed +before VAT.</p> +<table> +<colgroup> +<col style="width: 25%"> +<col style="width: 10%"> +<col style="width: 25%"> +<col style="width: 39%"> +</colgroup> +<thead> +<tr class="header"> +<th style="text-align: left;">Item</th> +<th style="text-align: center;">Qty</th> +<th style="text-align: center;">Vendor</th> +<th style="text-align: center;">Price Total</th> +</tr> +</thead> +<tbody> +<tr class="odd"> +<td style="text-align: left;">Half-size breadboard</td> +<td style="text-align: center;">5</td> +<td style="text-align: center;">Adafruit</td> +<td style="text-align: center;">25.00</td> +</tr> +<tr class="even"> +<td style="text-align: left;">Breadboarding wire bundle</td> +<td style="text-align: center;">2</td> +<td style="text-align: center;">Adafruit</td> +<td style="text-align: center;">9.90</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">Adafruit Perma-Proto Super Pack</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;">Adafruit</td> +<td style="text-align: center;">34.95</td> +</tr> +<tr class="even"> +<td style="text-align: left;">Hook-up Wire Spool Set - 22AWG Solid Core +- 6 x 25 ft</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;">Adafruit</td> +<td style="text-align: center;">15.95</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">Hakko Professional Quality 20-30 AWG Wire +Strippers</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;">Adafruit</td> +<td style="text-align: center;">17.50</td> +</tr> +<tr class="even"> +<td style="text-align: left;">SOIC-20 breakout 3 Pack</td> +<td style="text-align: center;">2</td> +<td style="text-align: center;">Adafruit</td> +<td style="text-align: center;">9.00</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">Adafruit Parts Pal</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;">Adafruit</td> +<td style="text-align: center;">19.95</td> +</tr> +<tr class="even"> +<td style="text-align: left;">TOTX1353(F)</td> +<td style="text-align: center;">10</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">92.88</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">16SEPC100M+TSS</td> +<td style="text-align: center;">20</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">11.56</td> +</tr> +<tr class="even"> +<td style="text-align: left;">SN74LS04N</td> +<td style="text-align: center;">25</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">19.30</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">CTS 208-4</td> +<td style="text-align: center;">10</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">5.76</td> +</tr> +<tr class="even"> +<td style="text-align: left;">DB25-SL-25</td> +<td style="text-align: center;">10</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">12.60</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">CFR-25JB-52-1K</td> +<td style="text-align: center;">100</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">2.47</td> +</tr> +<tr class="even"> +<td style="text-align: left;">CFR25SJT-52-2K2</td> +<td style="text-align: center;">100</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">2.47</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">1N4002B-G</td> +<td style="text-align: center;">30</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">4.32</td> +</tr> +<tr class="even"> +<td style="text-align: left;">25SEP10M+TSS</td> +<td style="text-align: center;">20</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">18.84</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">C320C104K5R5TA</td> +<td style="text-align: center;">50</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">5.05</td> +</tr> +<tr class="even"> +<td style="text-align: left;">FCR684208T</td> +<td style="text-align: center;">10</td> +<td style="text-align: center;">DigiKey</td> +<td style="text-align: center;">33.75</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">V1401</td> +<td style="text-align: center;">10</td> +<td style="text-align: center;">ebay (av13)</td> +<td style="text-align: center;">30.00</td> +</tr> +<tr class="even"> +<td style="text-align: left;">JUXINICE DB25 Male to Male Cable 3 feet, +26awg Tinned Copper Wires,Double-Shielded with Foil &Metal Braid, +D-SUB 25 pin Cable RS232 Serial Cable in Black</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;">Amazon</td> +<td style="text-align: center;">12.99</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">Antrader 2PCS DB25 Breakout Connector +D-sub 25-pin Female Adapter RS232 to Terminal Board Signal Module</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;">Amazon</td> +<td style="text-align: center;">11.99</td> +</tr> +<tr class="even"> +<td style="text-align: left;">Focusrite Scarlett 18i8 3rd Gen USB Audio +Interface</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;">Sweetwater</td> +<td style="text-align: center;">359.99</td> +</tr> +<tr class="odd"> +<td style="text-align: left;">Mako Driver Kit - 64 Precision Bits</td> +<td style="text-align: center;">1</td> +<td style="text-align: center;">iFixit</td> +<td style="text-align: center;">39.95</td> +</tr> +<tr class="even"> +<td style="text-align: left;">PCB Production</td> +<td style="text-align: center;">10</td> +<td style="text-align: center;">JLCPCB</td> +<td style="text-align: center;">14.50</td> +</tr> +</tbody> +</table> +<p>Grand Total = $810.67</p> +<h2 id="tocanch7" class="tvis">Potential future work</h2> +<p><del>First of all I need to fix the stingy ground plane.</del></p> +<p>V1401’s datasheet isn’t very clear on whether it can generate a +24-bit ADAT stream. Recordings made with the Scarlett 18i8 seem to have +the full 24-bit resolution, but that could be due to interpolation done +by the audio interface or operating system. Testing this requires an +oscilloscope which I currently don’t have.</p> +<p>It is highly feasible to implement an ADAT encoder / decoder in +software on cheap microcontrollers like the rp2040. The ADAT protocol is +documented <a href="https://ackspace.nl/wiki/ADAT_project">here</a> and +seems fairly straightforward to implement. This also has the added +benefit of making sure that 24-bit ADAT is really supported. However +this will also more than likely require an oscilloscope for debugging. +I’ll also have to learn rp2040’s PIO programming and theories on PLL +operation, both from scratch.</p> +<p>Exposing the MIDI interface on R-BUS also seems possible. However it +seems that XV-5080 doesn’t make use of the MIDI interface on R-BUS +<a id="n6" href="#note6" class="note">[6]</a>.</p> +<p><del>Maybe I’ll add more Touhou references to the silkscreen, who +knows.</del></p> +<h2 id="tocanch8" class="tvis">I want one! What should I do?</h2> +<p>First of all I’d suggest giving the <a href="ddd">manual</a> a read +to make sure this board really does what you want.</p> +<p>If you have made up your mind to get a board, I have some bad news +for you. Unfortunately right now there’s no straightforward way obtain +this board. Mainly because I have never sold anything online. Also this +board is bound to be a very niche product, and possibly can’t even +recover the development costs if I decided to sell them. Those are the +reasons why I currently have no plans to sell the board.</p> +<p>So right now your options are:</p> +<ul> +<li>Build the board yourself. The design is fully open source and build +instruction is included in the manual. If you are comfortable with +electronics DIY projects, this is probably your best bet.</li> +<li>Let me know you want one! Right now I still have a few +pre-production boards lying around. As long as you’re willing to cover +the terrible USPS shipping rates I’m willing to assemble a board and +send it your way. Of course you’re welcome to pay a little bit more… but +any excess for now will be treated as donations (a “pay what you think +it’s worth” model) – as I don’t have pricing fixed yet. Also if enough +people have expressed interest in the board I might actually start +selling them…</li> +</ul> +<h2 id="tocanch9" class="tvis">You’re an idiot and +your design is trash!</h2> +<p>First of all, thank you. I am indeed a massive idiot.</p> +<p>If you have suggestions on how this board could be improved, please +consider sending them to me. As a beginner in electronics design I can +definitely use any piece of advice coming from pretty much anyone in +this field. Any constructive suggestion will be greatly appreciated.</p> +<p>Of course other types of contributions will also be appreciated. For +example this board currently lacks any kind of enclosure as I have zero +idea how to create 3D models for real-life object manufacturing. Help in +this space is desperately needed.</p> +</article> +</div><br><hr> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: Not to shit on the country or +anything, after all I’m from said country … but Chinese clone chips are +notorious for being unreliable in general or straight up not +working.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: <a href="https://www.coolaudio.com/aboutus-page.php">“World +Class Management &Technical Team: One of the most extensive design +service companies in China”</a><br></span><span class="TText"><a id="note3" href="#n3">[3]</a>: which is probably a dumb thing to do. I should have read +through all of them <em>before</em> placing the order.<br></span><span class="TText"><a id="note4" href="#n4">[4]</a>: He doesn’t really do the repairs +himself nowadays any more, does he?<br></span><span class="TText"><a id="note5" href="#n5">[5]</a>: That thing which destroyed 2020 to 2022 +for countless people misspelled deliberately to avoid unwanted +attention.<br></span><span class="TText"><a id="note6" href="#n6">[6]</a>: See the section on XV-5080 in RPC-1’s manual.<br></span></div> + <div id="insanch" style="height:3em;"></div> + <div id="footer" style=""> + <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> + <div style="text-align:center;" class="TText"> + Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5 + <br> + Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span> + </div> + </div> + <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;"> + </div> + </div> + <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;"> + <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);"> + <div id="keyhint" style="margin-bottom:8px;"></div> + <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div> + <div style="height:2.25em;"> + <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button> + <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button> + </div> + + </div> + + +</div></body></html>
\ No newline at end of file diff --git a/blog/post/Privacy.html b/blog/post/Privacy.html index 578c056..fd85a57 100644 --- a/blog/post/Privacy.html +++ b/blog/post/Privacy.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,42 +31,9 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> </head> <body onload="ol()" style="overflow-x:hidden;"> @@ -81,9 +49,10 @@ loadTheme(); <li id="tocouter"> <span>Table of Contents</span> <ul id="tocroot"> - <li><a class="toctarg" href="#tocanch0">1. This site uses Cookies.</a></li><li><a class="toctarg" href="#tocanch1">2. Information collected by this site.</a></li><li><a class="toctarg" href="#tocanch2">3. Guestbook.</a></li><li><a class="toctarg" href="#tocanch3">4. Data retention.</a></li><li><a class="toctarg" href="#tocanch4">5. Backups.</a></li><li><a class="toctarg" href="#tocanch5">6. Your rights.</a></li></ul> + <li><a class="toctarg" href="#tocanch0">1. This site uses Cookies.</a></li><li><a class="toctarg" href="#tocanch1">2. Information collected by +this site.</a></li><li><a class="toctarg" href="#tocanch2">3. Guestbook.</a></li><li><a class="toctarg" href="#tocanch3">4. Data retention.</a></li><li><a class="toctarg" href="#tocanch4">5. Backups.</a></li><li><a class="toctarg" href="#tocanch5">6. Your rights.</a></li></ul> </li> - <li style="margin-left:-0.5em"><a id="prevp" href="2019-04-25.html">Prev post</a></li> + <li style="margin-left:-0.5em"><a id="prevp" href="2024-02-04.html">Prev post</a></li> <li style="margin-left:-0.5em"><a id="nextp" href="TOP.html">Next post</a></li> </ul> </div> @@ -92,19 +61,28 @@ loadTheme(); <div id="datetags" class="TText" style="margin-bottom:1em;">2019-09-03<br>#special-page</div> <hr><div id="article" class="TText"><article> <p>last updated 2019-09-03</p> -<p>These clauses might be super unprofessional. The only goal is to inform the users of this site (i.e. <a href="https://chrisoft.org">chrisoft.org</a>) about their rights and duties.</p> +<p>These clauses might be super unprofessional. The only goal is to +inform the users of this site (i.e. <a href="https://chrisoft.org">chrisoft.org</a>) about their rights and +duties.</p> <p>Take footnotes with a pinch of salt!</p> <h2 id="tocanch0" class="tvis">1. This site uses Cookies.</h2> -<p>... to store your browsing preferences and to improve your browsing experience. Below is a list of saved items:</p> +<p>… to store your browsing preferences and to improve your browsing +experience. Below is a list of saved items:</p> <ul> <li>color scheme of your choice.</li> <li>loop / shuffle states, last used music visualizer.</li> -<li>password of encrypted section in blog posts (if you decrypted one successfully).</li> +<li>password of encrypted section in blog posts (if you decrypted one +successfully).</li> </ul> <p>These cookies are not used by the server to do analytics.</p> -<p>If you don't like cookies for whatever reason, feel free to disable them. The basic functionality of the site will still work perfectly fine.</p> -<h2 id="tocanch1" class="tvis">2. Information collected by this site.</h2> -<p>This site collects a minimal set of your data to make the site work and do some basic level of spam prevention. Collected information includes:</p> +<p>If you don’t like cookies for whatever reason, feel free to disable +them. The basic functionality of the site will still work perfectly +fine.</p> +<h2 id="tocanch1" class="tvis">2. Information collected by +this site.</h2> +<p>This site collects a minimal set of your data to make the site work +and do some basic level of spam prevention. Collected information +includes:</p> <ul> <li>Your public IP address.</li> <li>User agent string of your browser.</li> @@ -113,32 +91,48 @@ loadTheme(); </ul> <p>The collected data are also retained in log files.</p> <h2 id="tocanch2" class="tvis">3. Guestbook.</h2> -<p>The guestbook page is where you can leave me a note. Your message will be <strong>permanently</strong> archived in a private location not accessible on this site. In case of a message being deleted from the guestbook page, the message <strong>doesn't</strong> also get removed in the private archive.</p> -<p>You <strong>can't</strong>:</p> +<p>The guestbook page is where you can leave me a note. Your message +will be <strong>permanently</strong> archived in a private location not +accessible on this site. In case of a message being deleted from the +guestbook page, the message <strong>doesn’t</strong> also get removed in +the private archive.</p> +<p>You <strong>can’t</strong>:</p> <ul> <li>Advertise.</li> <li>Be offensive.</li> </ul> -<p>Messages violating rules above will be deleted without further notice.</p> +<p>Messages violating rules above will be deleted without further +notice.</p> <p>You <strong>may</strong>:</p> <ul> -<li>Request deletion of <strong>your</strong> messages. Contact the owner of this site for further information on this.</li> +<li>Request deletion of <strong>your</strong> messages. Contact the +owner of this site for further information on this.</li> </ul> <p>This site <strong>will never</strong>:</p> <ul> <li>Alter your message.</li> <li>Take responsibility of the message you left.</li> </ul> -<p>When leaving a message, your IP address will be checked against a spamming blacklist. You can review the source code on this section <a href="https://cgit.chrisoft.org/web.git/tree/cgi/gb_newentry.cgi#n40">here</a>.</p> +<p>When leaving a message, your IP address will be checked against a +spamming blacklist. You can review the source code on this section <a href="https://cgit.chrisoft.org/web.git/tree/cgi/gb_newentry.cgi#n40">here</a>.</p> <h2 id="tocanch3" class="tvis">4. Data retention.</h2> -<p>Your data collected by this site will be kept indefinitely unless there is a data loss, about which you will not be informed, and might be covered by ...</p> +<p>Your data collected by this site will be kept indefinitely unless +there is a data loss, about which you will not be informed, and might be +covered by …</p> <h2 id="tocanch4" class="tvis">5. Backups.</h2> -<p>Like every site ever existed <a id="n1" href="#note1" class="note">[1]</a>, data stored on this site, including those submitted by you, is backed up in a timely manner. <a id="n2" href="#note2" class="note">[2]</a> These backups may contain deleted data.</p> +<p>Like every site ever existed <a id="n1" href="#note1" class="note">[1]</a>, data stored on this site, including those submitted by +you, is backed up in a timely manner. <a id="n2" href="#note2" class="note">[2]</a> These backups may contain deleted +data.</p> <h2 id="tocanch5" class="tvis">6. Your rights.</h2> -<p>You hold the right to decide whether to use this site. If you feel uncomfortable about these terms, you might as well consider stop using this site immediately.</p> -<p>Your rights on your submitted comments in the guestbook are already stated in section 3.</p> +<p>You hold the right to decide whether to use this site. If you feel +uncomfortable about these terms, you might as well consider stop using +this site immediately.</p> +<p>Your rights on your submitted comments in the guestbook are already +stated in section 3.</p> </article></div><br><hr> - <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: except the old Gentoo Wiki<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: Of course they are also deleted in a timely manner.<br></span></div> + <div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: except the old Gentoo +Wiki<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: Of course they are also +deleted in a timely manner.<br></span></div> <div id="insanch" style="height:3em;"></div> <div id="footer" style=""> <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> diff --git a/blog/post/TOP.html b/blog/post/TOP.html index 742239e..85fa584 100644 --- a/blog/post/TOP.html +++ b/blog/post/TOP.html @@ -1,9 +1,10 @@ -<html><head> +<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="theme-color" content="#000000"> <title>Chrisoft::Blog</title> <script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> <script type="text/javascript" src="/blog/footnoter.js"></script> <script type="text/javascript" src="/blog/aes-js.js"></script> <script type="text/javascript" src="/blog/scrypt.js"></script> @@ -30,44 +31,15 @@ function ol() else unsetevents(); } window.onresize(); + loadTheme(); _decryptonload(); } -function loadTheme(){ - var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"); - if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz'; - var ent=""; - var d=new Date(); - if(thm[0]=='z') - { - var m=d.getMonth()+1; - if(m>=3&&m<6)thm='0'+thm[1]; - else if(m>=6&&m<9)thm='1'+thm[1]; - else if(m>=9&&m<12)thm='2'+thm[1]; - else thm='3'+thm[1]; - } - if(thm[1]=='z') - {if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';} - ent=`theme${thm}`; - var R=new RegExp('theme[0-4][ab]'); - for(var i=0;i<document.styleSheets.length;++i) - { - if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent) - document.styleSheets[i].disabled=true; - else document.styleSheets[i].disabled=false; - } - var thmcolor=""; - switch(thm[0]) - { - case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break; - case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break; - case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break; - case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break; - } - document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor); -} -loadTheme(); </script> -</head> +<style> +td{padding-top:5px;padding-bottom:5px;vertical-align:top;} +</style><style> +article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} +</style></head> <body onload="ol()" style="overflow-x:hidden;"> <div id="panel" class="TText"> <ul id="panellist"> @@ -83,8 +55,8 @@ loadTheme(); <ul id="tocroot"> <li><a class="toctarg" href="#tocanch0">Early life</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch1">Preschool and elementary school life</a></li></ul></li><li><a class="toctarg" href="#tocanch2">Known problems</a></li></ul> </li> - <li style="margin-left:-0.5em"><a id="prevp" href="2018-12-06.html">Prev post</a></li> - <li style="margin-left:-0.5em"><a id="nextp">Next post</a></li> + <li style="margin-left:-0.5em"><a id="prevp" href="Privacy.html">Prev post</a></li> + <li style="margin-left:-0.5em"><a id="nextp" href="rbus-adat-m.html">Next post</a></li> </ul> </div> <div id="content"> @@ -93,9 +65,7 @@ loadTheme(); <hr><div id="article" class="TText"> <article> <table style="float:right;width:320px;background-color:rgba(255,255,255,0.2);text-align:left;font-size:0.8em;margin-left:10px;"> -<style> -td{padding-top:5px;padding-bottom:5px;vertical-align:top;} -</style> + <tbody><tr><td colspan="2" style="text-align:center;font-size:1.25em;"> Chris Xiong<br>熊?? </td></tr> @@ -206,9 +176,7 @@ any significant contribution to the world of computer yet. <li><a href="#c6">6 Known problems</a></li> </ul> </div> -<style> -article h2,article h3{border-bottom:1px solid #c0c0c0;overflow:hidden;} -</style> + <h2 id="tocanch0" class="tvis">Early life</h2> As a child of two outer party members, Chris Xiong's childhood life differs from most peers. As a result, his childhood life is often described as "dull" by others. diff --git a/blog/post/rbus-adat-m.html b/blog/post/rbus-adat-m.html new file mode 100644 index 0000000..e01b957 --- /dev/null +++ b/blog/post/rbus-adat-m.html @@ -0,0 +1,531 @@ +<!DOCTYPE html><html><head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<meta name="theme-color" content="#000000"> +<title>Chrisoft::Blog</title> +<script type="text/javascript" src="/panel.js"></script> +<script type="text/javascript" src="/themer.js"></script> +<script type="text/javascript" src="/blog/footnoter.js"></script> +<script type="text/javascript" src="/blog/aes-js.js"></script> +<script type="text/javascript" src="/blog/scrypt.js"></script> +<script type="text/javascript" src="/blog/sha256.js"></script> +<script type="text/javascript" src="/blog/decryptor.js"></script> +<link rel="stylesheet" type="text/css" href="/common.css"> +<link rel="stylesheet" type="text/css" href="/panel.css"> +<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a"> +<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b"> +<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a"> +<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b"> +<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a"> +<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b"> +<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a"> +<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b"> +<link rel="stylesheet" type="text/css" href="/blog/blogext.css"> +<script> +function ol() +{ + window.onresize=function() + { + if(window.innerWidth<768) + setupevents(); + else unsetevents(); + } + window.onresize(); + loadTheme(); + _decryptonload(); +} +</script> +<style> +/* start css.sty */ +.cmr-10x-x-109{} +.ec-qplr-x-x-109{} +.ec-qplr-x-x-248{font-size:225%;} +.LinBiolinumT-tlf-t1-x-x-248{font-size:225%; not-font-family: 'Linux Biolinum T', serif;} +.LinBiolinumTB-tlf-t1-x-x-248{font-size:225%; font-weight: bold; not-font-family: 'Linux Biolinum T', serif;} +.ec-qplb-x-x-109{} +.ectt-1095{ not-font-family: monospace,monospace;} +.ectt-1095{ not-font-family: monospace,monospace;} +.ectt-1095{ not-font-family: monospace,monospace;} +.ectt-1095{ not-font-family: monospace,monospace;} +.ectt-1095{ not-font-family: monospace,monospace;} +.ectt-1095{ not-font-family: monospace,monospace;} +.cmmi-10x-x-109{font-style: italic;} +.cmsy-10x-x-109{} +.ec-qplri-{font-size:90%;} +.ec-qplr-x-x-90{font-size:81%;} +p{margin-top:0;margin-bottom:0} +p.indent{text-indent:0;} +p + p{margin-top:1em;} +p + div, p + pre {margin-top:1em;} +div + p, pre + p {margin-top:1em;} +a { overflow-wrap: break-word; word-wrap: break-word; word-break: break-word; hyphens: auto; } +@media print {div.crosslinks {visibility:hidden;}} +a img { border-top: 0; border-left: 0; border-right: 0; } +center { margin-top:1em; margin-bottom:1em; } +td center { margin-top:0em; margin-bottom:0em; } +.Canvas { position:relative; } +img.math{vertical-align:middle;} +div.par-math-display, div.math-display{text-align:center;} +li p.indent { text-indent: 0em } +li p:first-child{ margin-top:0em; } +li p:last-child, li div:last-child { margin-bottom:0.5em; } +li p~ul:last-child, li p~ol:last-child{ margin-bottom:0.5em; } +.enumerate1 {list-style-type:decimal;} +.enumerate2 {list-style-type:lower-alpha;} +.enumerate3 {list-style-type:lower-roman;} +.enumerate4 {list-style-type:upper-alpha;} +div.newtheorem { margin-bottom: 2em; margin-top: 2em;} +.obeylines-h,.obeylines-v {white-space: nowrap; } +div.obeylines-v p { margin-top:0; margin-bottom:0; } +.overline{ text-decoration:overline; } +.overline img{ border-top: 1px solid black; } +td.displaylines {text-align:center; white-space:nowrap;} +.centerline {text-align:center;} +.rightline {text-align:right;} +pre.verbatim {not-font-family: monospace,monospace; text-align:left; clear:both; } +.fbox {padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +div.fbox {display:table} +div.center div.fbox {text-align:center; clear:both; padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +div.minipage{width:100%;} +div.center, div.center div.center {text-align: center; margin-left:1em; margin-right:1em;} +div.center div {text-align: left;} +div.flushright, div.flushright div.flushright {text-align: right;} +div.flushright div {text-align: left;} +div.flushleft {text-align: left;} +.underline{ text-decoration:underline; } +.underline img{ border-bottom: 1px solid black; margin-bottom:1pt; } +.framebox-c, .framebox-l, .framebox-r { padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; } +.framebox-c {text-align:center;} +.framebox-l {text-align:left;} +.framebox-r {text-align:right;} +span.thank-mark{ vertical-align: super } +span.footnote-mark sup.textsuperscript, span.footnote-mark a sup.textsuperscript{ font-size:80%; } +div.footnotes{border-top:solid 1px black; border-bottom:solid 1px black; padding-bottom:1ex; padding-top:0.5ex; margin-right:15%; margin-top:2ex; font-style:italic; font-size:85%;} +div.footnotes p{margin-top:0; margin-bottom:0; text-indent:0;} +div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; } +table.tabular td p{margin-top:0em;} +table.tabular {margin-left: auto; margin-right: auto;} +td p:first-child{ margin-top:0em; } +td p:last-child{ margin-bottom:0em; } +div.td00{ margin-left:0pt; margin-right:0pt; } +div.td01{ margin-left:0pt; margin-right:5pt; } +div.td10{ margin-left:5pt; margin-right:0pt; } +div.td11{ margin-left:5pt; margin-right:5pt; } +table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +td.td00{ padding-left:0pt; padding-right:0pt; } +td.td01{ padding-left:0pt; padding-right:5pt; } +td.td10{ padding-left:5pt; padding-right:0pt; } +td.td11{ padding-left:5pt; padding-right:5pt; } +table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +.hline hr, .cline hr{ height : 0px; margin:0px; } +.hline td, .cline td{ padding: 0; } +.hline hr, .cline hr{border:none;border-top:1px solid black;} +.tabbing-right {text-align:right;} +div.float, div.figure {margin-left: auto; margin-right: auto;} +div.float img {text-align:center;} +div.figure img {text-align:center;} +.marginpar,.reversemarginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;} +.marginpar p,.reversemarginpar p{margin-top:0.4em; margin-bottom:0.4em;} +.reversemarginpar{float:left;} +table.equation {width:100%;} +.equation td{text-align:center; } +td.equation { margin-top:1em; margin-bottom:1em; } +td.equation-label { width:5%; text-align:center; } +td.eqnarray4 { width:5%; white-space: normal; } +td.eqnarray2 { width:5%; } +table.eqnarray-star, table.eqnarray {width:100%;} +div.eqnarray{text-align:center;} +div.array {text-align:center;} +div.pmatrix {text-align:center;} +table.pmatrix {width:100%;} +span.pmatrix img{vertical-align:middle;} +div.pmatrix {text-align:center;} +table.pmatrix {width:100%;} +span.bar-css {text-decoration:overline;} +table.tabular{border-collapse: collapse; border-spacing: 0;} +img.cdots{vertical-align:middle;} +.partToc a, .partToc, .likepartToc a, .likepartToc {line-height: 200%; font-weight:bold; font-size:110%;} +.chapterToc a, .chapterToc, .likechapterToc a, .likechapterToc, .appendixToc a, .appendixToc {line-height: 200%; font-weight:bold;} +.index-item, .index-subitem, .index-subsubitem {display:block} +div.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:left;} +div.caption span.id{font-weight: bold; white-space: nowrap; } +h1.partHead{text-align: center} +p.bibitem { text-indent: -2em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; } +p.bibitem-p { text-indent: 0em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; } +.paragraphHead, .likeparagraphHead { margin-top:2em; font-weight: bold;} +.subparagraphHead, .likesubparagraphHead { font-weight: bold;} +.verse{white-space:nowrap; margin-left:2em} +div.maketitle {text-align:center;} +h2.titleHead{text-align:center;} +div.maketitle{ margin-bottom: 2em; } +div.author, div.date {text-align:center;} +div.thanks{text-align:left; margin-left:10%; font-size:85%; font-style:italic; } +div.abstract p {margin-left:5%; margin-right:5%;} +div.abstract {width:100%;} +.abstracttitle{text-align:center;margin-bottom:1em;} +figure.float, div.figure {margin-left: auto; margin-right: auto;} +figure.float img, figure.figure img {display: block; margin-left: auto; margin-right: auto;} +figure.figure {text-align:center;} +figcaption.caption {text-indent:-2em; margin-left:3em; margin-right:1em; text-align:center;} +figcaption.caption span.id{font-weight: bold; white-space: nowrap; } +.abstract{margin:1em;} +div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; } +table.tabular td p{margin-top:0em;} +table.tabular {margin-left: auto; margin-right: auto;} +td p:first-child{ margin-top:0em; } +td p:last-child{ margin-bottom:0em; } +div.td00{ margin-left:0pt; margin-right:0pt; } +div.td01{ margin-left:0pt; margin-right:5pt; } +div.td10{ margin-left:5pt; margin-right:0pt; } +div.td11{ margin-left:5pt; margin-right:5pt; } +table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +td.td00{ padding-left:0pt; padding-right:0pt; } +td.td01{ padding-left:0pt; padding-right:5pt; } +td.td10{ padding-left:5pt; padding-right:0pt; } +td.td11{ padding-left:5pt; padding-right:5pt; } +table[rules] {border-left:solid black 0.4pt; border-right:solid black 0.4pt; } +.hline hr, .cline hr{ height : 0px; margin:0px; } +.hline td, .cline td{ padding: 0; } +.hline hr, .cline hr{border:none;border-top:1px solid black;} +div.array {text-align:center;} +.rotatebox{display: inline-block;} +#TBL-4 colgroup{border-left: 1px solid black;border-right:1px solid black;} +#TBL-4{border-collapse:collapse;} +#TBL-4 colgroup{border-left: 1px solid black;border-right:1px solid black;} +#TBL-4{border-collapse:collapse;} +#TBL-4 colgroup{border-left: 1px solid black;border-right:1px solid black;} +#TBL-4{border-collapse:collapse;} +#TBL-5 colgroup{border-left: 1px solid black;border-right:1px solid black;} +#TBL-5{border-collapse:collapse;} +#TBL-5 colgroup{border-left: 1px solid black;border-right:1px solid black;} +#TBL-5{border-collapse:collapse;} +#TBL-5 colgroup{border-left: 1px solid black;border-right:1px solid black;} +#TBL-5{border-collapse:collapse;} +#TBL-5 colgroup{border-left: 1px solid black;border-right:1px solid black;} +#TBL-5{border-collapse:collapse;} +/* end css.sty */ + +</style></head> +<body onload="ol()" style="overflow-x:hidden;"> + <div id="panel" class="TText"> + <ul id="panellist"> + <li><a href="/"><h1>Chrisoft</h1></a></li> + <li><a href="/blog"><h2>Blog</h2></a></li> + <li><a href="#"><h3 id="title">RBUS-ADAT User Manual</h3></a></li> + <li><span>Tags</span> + <ul id="tagslist"> + <li><a href="/blog/list/music/">music</a></li><li><a href="/blog/list/electronics/">electronics</a></li></ul> + </li> + <li id="tocouter"> + <span>Table of Contents</span> + <ul id="tocroot"> + <li><a class="toctarg" href="#tocanch0">1 Preface</a></li><li><a class="toctarg" href="#tocanch1">2 NO WARRANTY</a></li><li><a class="toctarg" href="#tocanch2">3 Open hardware</a></li><li><a class="toctarg" href="#tocanch3">4 Safety notice</a></li><li><a class="toctarg" href="#tocanch4">5 Intended usage and applicable devices</a></li><li><a class="toctarg" href="#tocanch5">6 What’s on the board</a></li><li><a class="toctarg" href="#tocanch6">7 Quick start</a></li><li><a class="toctarg" href="#tocanch7">8 Choosing a suitable cable</a></li><li><a class="toctarg" href="#tocanch8">9 Notes</a></li><li><a class="toctarg" href="#tocanch9">10 Specifications</a></li><li><a class="toctarg" href="#tocanch10">11 Appendices</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch11">11.1 Build instructions</a></li><li><ul class="tocnode"><li><a class="toctarg" href="#tocanch12">11.1.1 PCB production</a></li><li><a class="toctarg" href="#tocanch13">11.1.2 Bill of materials</a></li><li><a class="toctarg" href="#tocanch14">11.1.3 Assembling</a></li><li><a class="toctarg" href="#tocanch15">11.1.4 Testing</a></li></ul></li><li><a class="toctarg" href="#tocanch16">11.2 Useful links</a></li><li><a class="toctarg" href="#tocanch17">11.3 Schematic</a></li><li><a class="toctarg" href="#tocanch18">11.4 Circuit board</a></li></ul></li></ul> + </li> + + + </ul> + </div> + <div id="content"> + <h2 id="titleh" class="TText" style="font-wight:normal;">RBUS-ADAT User Manual</h2> + <div id="datetags" class="TText" style="margin-bottom:1em;">2024-02-03<br>#music #electronics</div> + <hr><div id="article" class="TText"> + <div class="maketitle"> + + + +<h1>RBUS-ADAT User Manual</h1> + <div class="author"></div><br> +<img height="426" alt="PIC" src="//filestorage.chrisoft.org/blog/img/rbus-adat-cvc.png" decoding="async"> +<div class="date"></div> +This version of the manual is for <span class="ec-qplb-x-x-109">revision 1 </span>of the board. +Copyright Chris Xiong 2024. Copying of this hardware and its design as well as this documentation is permitted +under the terms of CERN-OHL-P v2. + + + </div> +<p><a id="x1-2r1"></a></p> + <h2 id="tocanch0" class="tvis"><span class="titlemark">1 </span> <a id="x1-10001"></a>Preface</h2> +<!-- l. 57 --><p class="noindent">If you are reading this, chances are you have become an unfortunate test subject of the RBUS-ADAT conversion +board (or have the nerves to think about becoming one). Well, here is (almost) everything you will want to know +about the board. If you want to learn about some less useful information about this thing, consider checking out +the devlog, which can be found by following the link to the project homepage listed under “Useful +links”. +</p><!-- l. 64 --><p class="indent"> As this manual is written as if it’s a blog post, which is prone to being very rambly, I’ll try to keep the rambling +low, at least make an attempt to do so. +</p><!-- l. 67 --><p class="indent"> Pictures in this manual are renders (computer-generated) and are for illustration purposes only. +</p><!-- l. 71 --><p class="indent"> <span class="ec-qplb-x-x-109">This product is neither affiliated with or endorsed by Roland Corporation. Roland does not approve +</span><span class="ec-qplb-x-x-109">connecting unofficial accessories to proprietary Roland interfaces.</span> +</p><!-- l. 76 --><p class="indent"> Visit <a href="https://chrisoft.org/rbusif">chrisoft.org/rbusif</a> for any future updates to this manual and the hardware. +<a id="x1-1001r1"></a> +</p> + <h2 id="tocanch1" class="tvis"><span class="titlemark">2 </span> <a id="x1-20002"></a>NO WARRANTY</h2> +<!-- l. 81 --><p class="noindent">THIS BOARD IS HOMEBREW AND EXPERIMENTAL HARDWARE. THERE IS NO WARRANTY FOR THIS +HARDWARE, INCLUDING ITS DESIGN AND THE FINISHED PRODUCT, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. THE DESIGNER SHALL NOT BE HELD LIABLE FOR ANY DAMAGE CAUSED BY USING +THIS HARDWARE, UNLESS REQUIRED BY APPLICABLE LAW. +</p><!-- l. 86 --><p class="indent"> For the full legalese text on warranty and liability, please refer to the <a href="https://ohwr.org/cern_ohl_p_v2.txt">license text</a>. +</p><!-- l. 89 --><p class="indent"> If this board fried your equipment, don’t try to extract anything from me. That’s what this section is trying to +say. +<a id="x1-2001r2"></a> +</p> + <h2 id="tocanch2" class="tvis"><span class="titlemark">3 </span> <a id="x1-30003"></a>Open hardware</h2> +<!-- l. 94 --><p class="noindent">This board is open hardware licensed under the <a href="https://ohwr.org/cern_ohl_p_v2.txt">CERN Open Hardware Licence Version 2 - Permissive</a> +license. Feel free to make as many of this board as you wish and sell them, as long as your follow the +terms. +</p><!-- l. 99 --><p class="indent"> Contributions welcome and will be appreciated. If you have any suggestions to improve the board, +please feel free to contact the author. The author’s contact information can be found on the project +homepage. +<a id="x1-3001r3"></a> +</p> + <h2 id="tocanch3" class="tvis"><span class="titlemark">4 </span> <a id="x1-40004"></a>Safety notice</h2> +<!-- l. 105 --><p class="noindent">There’s no enclosure for this board. As a result there would be exposed conductors on both sides of the board. +You’re advised to take measures to prevent them from shorting out. You may try any combination of the +following: +</p> + <ul class="itemize1"> + <li class="itemize"> + <!-- l. 110 --><p class="noindent">Placing the board on an non-conductive surface. + </p></li> + <li class="itemize"> + <!-- l. 111 --><p class="noindent">There are two M2 mounting holes in the board. Using two M2 screws and nuts, install a plastic sheet + (or cardboard even) under and / or over the board. + + + </p></li> + <li class="itemize"> + <!-- l. 113 --><p class="noindent">Don’t use the board at all. Don’t even think about it.</p></li></ul> +<!-- l. 116 --><p class="indent"> Again, if you fried your equipment while using this board, it’s all your fault. I mean not really – I would still +want to know what happened. But it’s all your fault. + + +<a id="x1-4001r4"></a> +</p> + <h2 id="tocanch4" class="tvis"><span class="titlemark">5 </span> <a id="x1-50005"></a>Intended usage and applicable devices</h2> +<!-- l. 124 --><p class="noindent">RBUS-ADAT is designed for use with the Roland XV-5080. It converts the 8 digital outputs exposed by XV-5080’s +R-BUS port to a standard ADAT lightpipe stream which can be recorded with any audio interface with an ADAT +input. +</p><!-- l. 128 --><p class="indent"> The ADAT output from this converter is 20-bit and has the same sampling rate as the input supplied from the +R-BUS port. +</p><!-- l. 131 --><p class="indent"> This converter <span class="ec-qplb-x-x-109">cannot</span>: +</p> + <ul class="itemize1"> + <li class="itemize"> + <!-- l. 134 --><p class="noindent">Convert ADAT back to R-BUS input. i.e. you can’t record an ADAT stream on a V-Studio through + R-BUS with this converter. + </p></li> + <li class="itemize"> + <!-- l. 136 --><p class="noindent">Serve as a clock source for the connected R-BUS device. You should always select “internal” as the + clock source for the connected R-BUS device. + </p></li> + <li class="itemize"> + <!-- l. 138 --><p class="noindent">Expose the MIDI interface on the R-BUS port.</p></li></ul> +<!-- l. 141 --><p class="indent"> The converter is designed and tested with the XV-5080. In addition, the only audio interface that +has been verified to work is Focusrite Scarlett 18i8 3rd gen. I don’t have the resources to test other +devices. +</p><!-- l. 145 --><p class="indent"> The converter has not been tested against VM- or VS- devices that feature RMDB 2 / R-BUS ports +or MV-8<span class="cmsy-10x-x-109">××× </span>fitted with the MV8-OP1 expansion but may still work as a unidirectional converter +as intended. If you decide to try this converter with these devices, reporting the results would be +appreciated. +</p><!-- l. 151 --><p class="indent"> The converter is not compatible with devices with the older RMDB port. +<a id="x1-5001r5"></a> +</p> + <h2 id="tocanch5" class="tvis"><span class="titlemark">6 </span> <a id="x1-60006"></a>What’s on the board</h2> +<div class="center"> +<!-- l. 155 --><p class="noindent"> +</p><!-- l. 156 --><p class="noindent"><img height="341" alt="PIC" src="//filestorage.chrisoft.org/blog/img/rbus-adat-tvp.png" decoding="async"></p></div> + <ol class="enumerate1"> +<li class="enumerate" id="x1-6002x1"> + <!-- l. 160 --><p class="noindent"><span class="ec-qplb-x-x-109">R-BUS DB-25 Connector</span>. See “Choosing a suitable cable” for what you should and shouldn’t plug + into this connector. + </p></li> +<li class="enumerate" id="x1-6004x2"> + <!-- l. 162 --><p class="noindent"><span class="ec-qplb-x-x-109">Power indicator</span>. Illuminates if the board is receiving power. + + + </p></li> +<li class="enumerate" id="x1-6006x3"> + <!-- l. 164 --><p class="noindent"><span class="ec-qplb-x-x-109">ADAT Lightpipe output</span>. Connect to a device capable of recording ADAT data stream with a + TOSLINK cable. + </p></li> +<li class="enumerate" id="x1-6008x4"> + <!-- l. 166 --><p class="noindent"><span class="ec-qplb-x-x-109">Pure hecking magic</span>.</p></li></ol> +<p><a id="x1-6009r6"></a></p> + <h2 id="tocanch6" class="tvis"><span class="titlemark">7 </span> <a id="x1-70007"></a>Quick start</h2> + <ol class="enumerate1"> +<li class="enumerate" id="x1-7002x1"> + <!-- l. 172 --><p class="noindent">Using a suitable cable (see the following chapter), connect the R-BUS DB-25 connector on the board + to the R-BUS port on your Roland device. + </p></li> +<li class="enumerate" id="x1-7004x2"> + <!-- l. 174 --><p class="noindent">Connect the ADAT output on the board to the ADAT input of your recording equipment with a + TOSLINK optical fiber cable. + </p></li> +<li class="enumerate" id="x1-7006x3"> + <!-- l. 176 --><p class="noindent">Turn on the Roland device, then turn on your recording equipment.</p></li></ol> +<p><a id="x1-7007r7"></a></p> + <h2 id="tocanch7" class="tvis"><span class="titlemark">8 </span> <a id="x1-80008"></a>Choosing a suitable cable</h2> +<!-- l. 181 --><p class="noindent">DO <span class="ec-qplb-x-x-109">NOT </span>USE ROLAND’S OFFICIAL R-BUS CABLE!!! +</p><!-- l. 183 --><p class="indent"> Please use a straight through DB-25 male-to-male (pins on both ends) cable to connect the R-BUS port on your +device to the port on the converter. These cables connect pin 1 to pin 1, pin 2 to pin 2, pin 3 to pin 3 +etc. These cables are usually sold as “DB-25 RS-232 serial cable”. Do NOT use any of the following +cables: +</p> + <ul class="itemize1"> + <li class="itemize"> + <!-- l. 190 --><p class="noindent">Roland’s official R-BUS / RMDB 2 cable + </p></li> + <li class="itemize"> + <!-- l. 191 --><p class="noindent">Parallel port cable + </p></li> + <li class="itemize"> + <!-- l. 192 --><p class="noindent">SCSI cable + </p></li> + <li class="itemize"> + + + <!-- l. 193 --><p class="noindent">LPT port Printer cable + </p></li> + <li class="itemize"> + <!-- l. 194 --><p class="noindent">Null modem cable</p></li></ul> +<!-- l. 197 --><p class="indent"> These cables all use the same DB-25 connector but are wired differently. Using the wrong cable may damage the +converter and / or your device. +</p><!-- l. 200 --><p class="indent"> Note that many RS-232 serial cables designed for relatively newer computers use the DE-9 connector. You’ll +need the older style with DB-25 connectors (which conveniently have 25 pins). +</p><!-- l. 204 --><p class="indent"> DO <span class="ec-qplb-x-x-109">NOT </span>USE ROLAND’S OFFICIAL R-BUS CABLE!!! +<a id="x1-8001r8"></a> +</p> + <h2 id="tocanch8" class="tvis"><span class="titlemark">9 </span> <a id="x1-90009"></a>Notes</h2> + <ul class="itemize1"> + <li class="itemize"> + <!-- l. 209 --><p class="noindent">Digital recording made from Scarlett 18i8 of the converted ADAT stream seem to have the full 24-bit + resolution. However this might be due to interpolation done by the audio interface or the operating + system. I do not have proper equipment to verify the bit depth of the output data stream. As such, + only 20 bits out output resolution is guaranteed. + </p></li> + <li class="itemize"> + <!-- l. 215 --><p class="noindent">The optical output port is a tight fit. You have to insert the plug all the way in until you hear a click.</p></li></ul> +<p><a id="x1-9001r9"></a></p> + <h2 id="tocanch9" class="tvis"><span class="titlemark">10 </span> <a id="x1-1000010"></a>Specifications</h2> +<div class="center"> +<!-- l. 220 --><p class="noindent"> +</p> + <table class="tabular" id="TBL-4"><colgroup id="TBL-4-1g"><col id="TBL-4-1"></colgroup><colgroup id="TBL-4-2g"><col id="TBL-4-2"></colgroup><tbody><tr class="hline"><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-4-1-"><td style="white-space:nowrap; text-align:left;" class="td11" id="TBL-4-1-1"> Signal processing </td><td style="white-space:normal; text-align:left;" class="td11" id="TBL-4-1-2"> <!-- l. 232 --><p class="noindent">24-bit internal, 20-bit output </p></td> +</tr><tr class="hline"><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-4-2-"><td style="white-space:nowrap; text-align:left;" class="td11" id="TBL-4-2-1"> Sampling rate </td><td style="white-space:normal; text-align:left;" class="td11" id="TBL-4-2-2"> <!-- l. 232 --><p class="noindent">44.1 kHz, 48 kHz </p></td> +</tr><tr class="hline"><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-4-3-"><td style="white-space:nowrap; text-align:left;" class="td11" id="TBL-4-3-1"> Connectors </td><td style="white-space:normal; text-align:left;" class="td11" id="TBL-4-3-2"> <!-- l. 232 --><p class="noindent">R-BUS (Input only): DB-25<br class="newline">Digital output: ADAT Lightpipe (JIS F05 connector) </p></td> +</tr><tr class="hline"><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-4-4-"><td style="white-space:nowrap; text-align:left;" class="td11" id="TBL-4-4-1"> Chipset </td><td style="white-space:normal; text-align:left;" class="td11" id="TBL-4-4-2"> <!-- l. 232 --><p class="noindent">coolaudio V1401 (Alesis AL1401 equiv.) </p></td> +</tr><tr class="hline"><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-4-5-"><td style="white-space:nowrap; text-align:left;" class="td11" id="TBL-4-5-1"> Rated current </td><td style="white-space:normal; text-align:left;" class="td11" id="TBL-4-5-2"> <!-- l. 232 --><p class="noindent"><span class="cmmi-10x-x-109"><</span>8 mA </p></td> +</tr><tr class="hline"><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-4-6-"><td style="white-space:nowrap; text-align:left;" class="td11" id="TBL-4-6-1"> Rated power </td><td style="white-space:normal; text-align:left;" class="td11" id="TBL-4-6-2"> <!-- l. 232 --><p class="noindent"><span class="cmmi-10x-x-109"><</span>0.04 W </p></td> +</tr><tr class="hline"><td><hr></td><td><hr></td></tr></tbody></table></div> +<p><a id="x1-10001r10"></a></p> + <h2 id="tocanch10" class="tvis"><span class="titlemark">11 </span> <a id="x1-1100011"></a>Appendices</h2> +<p><a id="x1-11001r1"></a></p> + <h3 id="tocanch11" class="tvis"><span class="titlemark">11.1 </span> <a id="x1-120001"></a>Build instructions</h3> +<!-- l. 240 --><p class="noindent">This is intended for people who didn’t end up with a pre-assembled board. If you already have a fully assembled +board, you may ignore this section. +</p><!-- l. 243 --><p class="indent"> If you have a kit, you may skip to step 3. +<a id="x1-12001r1"></a> +</p> + <h4 id="tocanch12" class="tvis"><span class="titlemark">11.1.1 </span> <a id="x1-130001"></a>PCB production</h4> +<!-- l. 247 --><p class="noindent">I assume if you have chosen to take this route, you know what you are doing. + + +</p><!-- l. 249 --><p class="indent"> You’ll find Gerber files in the <span class="obeylines-h"><span class="verb"><span class="ectt-1095">out</span></span></span> directory of the project repository that you can upload to your favorite PCB +production service provider. Or alternatively if you want to tweak the board you can open up the KiCad project +files, which are also found in the project repository. +</p><!-- l. 254 --><p class="indent"> Many PCB manufacturers will add a board identifier to each PCB they make and allow customization of where +this identifier will be placed. The front side silkscreen text “Production ID” is reserved for this purpose. Please refer +to the ordering instructions of your PCB manufacturer for the details. Usually this will involve changing +the text to something specific to that manufacturer and selecting an option before submitting your +order. +<a id="x1-13001r13"></a> +</p> + <h4 id="tocanch13" class="tvis"><span class="titlemark">11.1.2 </span> <a id="x1-140002"></a>Bill of materials</h4> + <div class="minipage"><div class="center"> +<!-- l. 264 --><p class="noindent"> +</p> +<div class="tabular"> <table class="tabular" id="TBL-5"><colgroup id="TBL-5-1g"><col id="TBL-5-1"></colgroup><colgroup id="TBL-5-2g"><col id="TBL-5-2"></colgroup><colgroup id="TBL-5-3g"><col id="TBL-5-3"></colgroup><tbody><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-1-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-1-1"> Designator </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-1-2"> Part </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-1-3"> Qty </td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-2-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-2-1"> C1 </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-2-2"> 16V 100<span class="cmmi-10x-x-109">μ</span>F electrolytic </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-2-3"> 1 </td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-3-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-3-1"> C2, C3, C4 </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-3-2"> 50V 0.1<span class="cmmi-10x-x-109">μ</span>F ceramic </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-3-3"> 3 </td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-4-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-4-1"> CN1 </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-4-2"> Cliff FCR684208T </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-4-3"> 1 </td></tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-5-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-5-1"> D1 </td> <td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-5-2"> 1N4002 </td> <td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-5-3"> 1</td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-6-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-6-1"> D2 </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-6-2"> Red GaAsP / GaP LED 3mm <span class="footnote-mark"><a href="#fn1x2" id="fn1x2-bk"><sup class="textsuperscript">a</sup></a></span><a id="x1-14001f0"></a> </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-6-3"> 1 </td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-7-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-7-1"> J1 </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-7-2"> Adam Tech DB25-SL-25 <span class="footnote-mark"><a href="#fn2x2" id="fn2x2-bk"><sup class="textsuperscript">b</sup></a></span><a id="x1-14002f0"></a> </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-7-3"> 1 </td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-8-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-8-1"> R1 </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-8-2"> 1/4W 1k<span class="cmr-10x-x-109">Ω </span></td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-8-3"> 1 </td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-9-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-9-1"> R2 </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-9-2"> 1/4W 2.2k<span class="cmr-10x-x-109">Ω </span></td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-9-3"> 1 </td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-10-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-10-1"> U1 </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-10-2"> SN74LS04N </td><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-10-3"> 1 </td></tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr><tr style="vertical-align:baseline;" id="TBL-5-11-"><td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-11-1"> U2 </td> <td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-11-2"> coolaudio V1401 </td> <td style="white-space:nowrap; text-align:center;" class="td11" id="TBL-5-11-3"> 1</td> +</tr><tr class="hline"><td><hr></td><td><hr></td><td><hr></td></tr></tbody></table> +</div></div></div> +<p><a id="x1-14003r14"></a></p> + <h4 id="tocanch14" class="tvis"><span class="titlemark">11.1.3 </span> <a id="x1-150003"></a>Assembling</h4> +<!-- l. 284 --><p class="noindent">Again, I assume if you are assembling the board yourself, you possess the appropriate set of skills. It’s now time for +them to shine. Most components are through hole so it should be easy. If it’s not already obvious, solder the only +SMD chip first. +<a id="x1-15001r15"></a> +</p> + <h4 id="tocanch15" class="tvis"><span class="titlemark">11.1.4 </span> <a id="x1-160004"></a>Testing</h4> +<!-- l. 291 --><p class="noindent">If you have a 5V power source, it is suggested to test your assembled board first. Supply 5V between the anode of +the D1 and the metal shell of the DB-25 connector (GND). Check if anything pops. +<a id="x1-16001r12"></a> +</p> + <h3 id="tocanch16" class="tvis"><span class="titlemark">11.2 </span> <a id="x1-170002"></a>Useful links</h3> + <ul class="itemize1"> + <li class="itemize"> + <!-- l. 298 --><p class="noindent">R-BUS project homepage: <a href="https://chrisoft.org/rbusif" class="url"><span class="ectt-1095">https://chrisoft.org/rbusif</span></a> + </p></li> + <li class="itemize"> + <!-- l. 299 --><p class="noindent">Project repository for this board: <a href="https://cgit.chrisoft.org/rbus-adat.git" class="url"><span class="ectt-1095">https://cgit.chrisoft.org/rbus-adat.git</span></a> + </p></li> + <li class="itemize"> + <!-- l. 300 --><p class="noindent">Online version of this manual: <br class="newline"><a href="https://chrisoft.org/blog/post/rbus-adat-m.html" class="url"><span class="ectt-1095">https://chrisoft.org/blog/post/rbus-adat-m.html</span></a> (html version)<br class="newline"><a href="https://filestorage.chrisoft.org/blog/data/rbus_adat_m.pdf" class="url"><span class="ectt-1095">https://filestorage.chrisoft.org/blog/data/rbus_adat_m.pdf</span></a> (pdf version)</p></li></ul> +<p><a id="x1-17001r17"></a></p> + <h3 id="tocanch17" class="tvis"><span class="titlemark">11.3 </span> <a id="x1-180003"></a>Schematic</h3><div class="center"> +<!-- l. 306 --><p class="noindent"> + + +</p><!-- l. 307 --><p class="noindent"> <img width="398" alt="PIC" src="//filestorage.chrisoft.org/blog/img/schr-.png" decoding="async"></p></div> + + +<p><a id="x1-18001r18"></a></p> + <h3 id="tocanch18" class="tvis"><span class="titlemark">11.4 </span> <a id="x1-190004"></a>Circuit board</h3> +<!-- l. 312 --><p class="noindent">Front side </p> +<div class="center"> +<!-- l. 313 --><p class="noindent"> +</p><!-- l. 314 --><p class="noindent"> <img width="683" alt="PIC" src="//filestorage.chrisoft.org/blog/img/pcbfr-.png" decoding="async"></p></div> + + +<!-- l. 317 --><p class="noindent">Back side </p> +<div class="center"> +<!-- l. 318 --><p class="noindent"> +</p><!-- l. 319 --><p class="noindent"> <img width="683" alt="PIC" src="//filestorage.chrisoft.org/blog/img/pcbbr-.png" decoding="async"></p></div> + + + <div class="footnotes"><!-- l. 272 --><p class="noindent"><span class="footnote-mark"><a href="#fn1x2-bk" id="fn1x2"><sup class="textsuperscript">a</sup></a></span><span class="ec-qplr-x-x-90">5mm used in prototypes</span></p> +<!-- l. 273 --><p class="noindent"><span class="footnote-mark"><a href="#fn2x2-bk" id="fn2x2"><sup class="textsuperscript">b</sup></a></span><span class="ec-qplr-x-x-90">Or any right angle DB-25 receptacle with 8.1mm backset spacing</span></p> </div> + + +</div><br><hr> + <div class="TText" id="notediv" style="font-size:80%;"></div> + <div id="insanch" style="height:3em;"></div> + <div id="footer" style=""> + <div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div> + <div style="text-align:center;" class="TText"> + Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5 + <br> + Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span> + </div> + </div> + <div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;"> + </div> + </div> + <div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;"> + <div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);"> + <div id="keyhint" style="margin-bottom:8px;"></div> + <div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div> + <div style="height:2.25em;"> + <button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button> + <button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button> + </div> + + </div> + + +</div></body></html>
\ No newline at end of file |