diff options
Diffstat (limited to 'blog')
-rw-r--r-- | blog/list/0.html | 16 | ||||
-rw-r--r-- | blog/list/1.html | 14 | ||||
-rw-r--r-- | blog/list/10.html | 71 | ||||
-rw-r--r-- | blog/list/2.html | 14 | ||||
-rw-r--r-- | blog/list/3.html | 10 | ||||
-rw-r--r-- | blog/list/4.html | 14 | ||||
-rw-r--r-- | blog/list/5.html | 14 | ||||
-rw-r--r-- | blog/list/6.html | 12 | ||||
-rw-r--r-- | blog/list/7.html | 10 | ||||
-rw-r--r-- | blog/list/8.html | 10 | ||||
-rw-r--r-- | blog/list/9.html | 10 | ||||
-rw-r--r-- | blog/list/device-review/0.html | 12 | ||||
-rw-r--r-- | blog/list/device-review/1.html | 4 | ||||
-rw-r--r-- | blog/list/garbage/4.html | 76 | ||||
-rw-r--r-- | blog/list/hands-on/0.html | 6 | ||||
-rw-r--r-- | blog/list/midi/0.html | 6 | ||||
-rw-r--r-- | blog/list/music/0.html | 6 | ||||
-rw-r--r-- | blog/post/2017-06-29.html | 38 | ||||
-rw-r--r-- | blog/post/2019-04-25.html | 8 | ||||
-rw-r--r-- | blog/post/2020-11-20.html | 1507 |
20 files changed, 1746 insertions, 112 deletions
diff --git a/blog/list/0.html b/blog/list/0.html index 8f52684..96f1a54 100644 --- a/blog/list/0.html +++ b/blog/list/0.html @@ -55,22 +55,22 @@ function ol() <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 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-03</span></div> + <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-09-04.html">September 2019 Site Update</a></h3> + <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="">#web</span> - <span class="right" id="">2019-09-04/2019-11-13</span></div> + <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-06-30</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> + <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="">#device-review #midi #music #hands-on</span> - <span class="right" id="">2019-04-25/2021-01-31</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> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/1.html b/blog/list/1.html index 23020b2..161d3ae 100644 --- a/blog/list/1.html +++ b/blog/list/1.html @@ -47,15 +47,20 @@ 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-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/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-12-06.html">小米 MIX 3 上手体验</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-31</span></div> + <span class="right" id="">2018-12-06/2021-01-30</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> @@ -66,11 +71,6 @@ function ol() <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><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> - <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></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/10.html b/blog/list/10.html new file mode 100644 index 0000000..7037b95 --- /dev/null +++ b/blog/list/10.html @@ -0,0 +1,71 @@ +<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/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/2014-11-14.html">喷当代中国大陆的“考场作文”制度 (校注版)</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> + <span class="right" id="">2014-11-14UNLISTED/2021-06-26</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/9.html"><<</a></span> + <span style="text-align:center;display:table-cell;" id="page">11/11</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/2.html b/blog/list/2.html index 98f9833..05ab497 100644 --- a/blog/list/2.html +++ b/blog/list/2.html @@ -47,6 +47,11 @@ 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-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="">#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-05-18.html">Ideology vs Pragmatism &c.</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#sophistry #garbage</span> @@ -55,22 +60,17 @@ function ol() <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-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 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> <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-04-17.html">The "Deepin is spyware" problem</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></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/3.html b/blog/list/3.html index 40c42e7..d07396e 100644 --- a/blog/list/3.html +++ b/blog/list/3.html @@ -47,6 +47,11 @@ 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-04-17.html">The "Deepin is spyware" problem</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><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> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#devel #qmidiplayer #opengl</span> @@ -66,11 +71,6 @@ function ol() <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><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> - <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-13</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 1b31f55..1bb9009 100644 --- a/blog/list/4.html +++ b/blog/list/4.html @@ -47,6 +47,11 @@ 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-12-21.html">为什么我<i>就是不</i>使用Mac</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><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> @@ -55,7 +60,7 @@ function ol() <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="">#garbage #daily-life</span> - <span class="right" id="">2017-06-29/2018-10-11</span></div> + <span class="right" id="">2017-06-29/2021-06-26</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> <br> @@ -65,12 +70,7 @@ function ol() <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> - </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> - <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> + <span class="right" id="">2017-05-08/2019-02-12</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 ae61983..d8843c3 100644 --- a/blog/list/5.html +++ b/blog/list/5.html @@ -47,10 +47,15 @@ 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-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="">#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/2017-02-13.html">[多大图警告]ls /dev</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-13</span></div> + <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/2017-01-18.html">Trash dump for the third semester</a></h3> <br> @@ -60,17 +65,12 @@ function ol() <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="">#computer-repairing #garbage</span> - <span class="right" id="">2017-01-09/2019-02-13</span></div> + <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-09-24.html">2-in-1</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><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> - <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> </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 a3becf5..147fa48 100644 --- a/blog/list/6.html +++ b/blog/list/6.html @@ -47,10 +47,15 @@ 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-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="">#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-05-12.html">ThinkPad X1 Yoga初体验</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-13</span></div> + <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-04-09.html">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</a></h3> <br> @@ -66,11 +71,6 @@ function ol() <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><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> - <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></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/7.html b/blog/list/7.html index bb44d07..380f817 100644 --- a/blog/list/7.html +++ b/blog/list/7.html @@ -47,6 +47,11 @@ 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-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="">#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/2016-01-25.html">放假...</a></h3> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#daily-life</span> @@ -66,11 +71,6 @@ function ol() <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><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> - <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></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/8.html b/blog/list/8.html index ef6e19f..d64655e 100644 --- a/blog/list/8.html +++ b/blog/list/8.html @@ -47,6 +47,11 @@ 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-23.html">Chris' First Development Blog</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><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> <br> <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#random-xp</span> @@ -66,11 +71,6 @@ function ol() <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> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/9.html b/blog/list/9.html index 2cfd383..4f0ec5f 100644 --- a/blog/list/9.html +++ b/blog/list/9.html @@ -47,10 +47,20 @@ 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-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> <span class="right" id="">2015-10-29/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/2014-11-14.html">喷当代中国大陆的“考场作文”制度 (校注版)</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> + <span class="right" id="">2014-11-14UNLISTED/2021-06-26</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/device-review/0.html b/blog/list/device-review/0.html index 0add56a..b94c8ac 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/toxic-stuff">toxic-stuff</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/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> @@ -50,27 +50,27 @@ 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/2021-03-04</span></div> + <span class="right" id="">2020-11-20/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/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/2021-01-31</span></div> + <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-12-06.html">小米 MIX 3 上手体验</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-31</span></div> + <span class="right" id="">2018-12-06/2021-01-30</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> <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-13</span></div> + <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-02-13.html">[多大图警告]ls /dev</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-13</span></div> + <span class="right" id="">2017-02-13/2019-02-12</span></div> </div></div> <div id="insanch" style="height:5em;"></div> <div id="footer"> diff --git a/blog/list/device-review/1.html b/blog/list/device-review/1.html index 646b341..31c9b3c 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/toxic-stuff">toxic-stuff</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/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> @@ -50,7 +50,7 @@ function ol() <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="">#device-review</span> - <span class="right" id="">2016-05-12/2019-02-13</span></div> + <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/2015-11-22.html">Raspberry Pi2 初体验</a></h3> <br> diff --git a/blog/list/garbage/4.html b/blog/list/garbage/4.html new file mode 100644 index 0000000..621311a --- /dev/null +++ b/blog/list/garbage/4.html @@ -0,0 +1,76 @@ +<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/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/2015-10-29.html">noname01.pas</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> + <span class="right" id="">2015-10-29/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/2014-11-14.html">喷当代中国大陆的“考场作文”制度 (校注版)</a></h3> + <br> + <div style="display:table;width:100%;table-layout:fixed;"><span class="left" id="">#garbage</span> + <span class="right" id="">2014-11-14UNLISTED/2021-06-26</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/garbage/3.html"><<</a></span> + <span style="text-align:center;display:table-cell;" id="page">5/5</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/hands-on/0.html b/blog/list/hands-on/0.html index 2b2abc5..3dd10d3 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/toxic-stuff">toxic-stuff</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/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> @@ -50,12 +50,12 @@ function ol() <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/2021-01-31</span></div> + <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-12-06.html">小米 MIX 3 上手体验</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-31</span></div> + <span class="right" id="">2018-12-06/2021-01-30</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> <br> diff --git a/blog/list/midi/0.html b/blog/list/midi/0.html index 305cafe..8085bb6 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/toxic-stuff">toxic-stuff</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/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> @@ -50,12 +50,12 @@ 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/2021-03-04</span></div> + <span class="right" id="">2020-11-20/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/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/2021-01-31</span></div> + <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/2016-04-09.html">The MIDI File Format Specification and MIDI Implementation in QMidiPlayer</a></h3> <br> diff --git a/blog/list/music/0.html b/blog/list/music/0.html index 6fc26fb..813c5bf 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/toxic-stuff">toxic-stuff</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/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> @@ -50,12 +50,12 @@ 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/2021-03-04</span></div> + <span class="right" id="">2020-11-20/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/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/2021-01-31</span></div> + <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> diff --git a/blog/post/2017-06-29.html b/blog/post/2017-06-29.html index 3f47e7e..4f5d1fc 100644 --- a/blog/post/2017-06-29.html +++ b/blog/post/2017-06-29.html @@ -4,6 +4,7 @@ <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;"> @@ -660,7 +628,7 @@ that millions of fools would beg to be jailed. <p> Broken pipe. </p> -<encrypted hint="Don't read it." hash="6a3c5979d02cf25274065788a7128d2a7734bea70bcf7fff2afe1f5bfe9a3e86" encont="XEYqv08FzpVV0TD3zCHqVDBcjI+evdHu5FSev6OLJyXylkQ5fe3hPHPx6Wbxo3C4kvbrwy0F+G02aKu41tjuAEPu/ZPkeZ2V1CnRVE6FXgAzn1jfSqoiKWq/QYzTizh/IdavQQnQhgg6D4QRlZmeP7NJGoKCjfcW+UtI8+SucTUSAIp9z1XcOZQ+75vwSiodNwOH50hs5l2w4HUzwyGv/JJQDUGZWT9vnQ3bgJXOiGzl0RtMMNE=" 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="XEYqv08FzpVV0TD3zCHqVDBcjI+evdHu5FSev6OLJyXylkQ5fe3hPHPx6Wbxo3C4kvbrwy0F+G02aKu41tjuAEPu/ZPkeZ2V1CnRVE6FXgAzn1jfSqoiKWq/QYzTizh/IdavQQnQhgg6D4QRlZmeP7NJGoKCjffQpn4jptvEJDRLSoMzl3upV4xLr42mAi5Rfz7yh3Y4eD7q5AJdzk7XzvYPNC3FW0QDsH6NhNKwlhxTcj4AIassBQ==" 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/2019-04-25.html b/blog/post/2019-04-25.html index e2f6b08..069f22d 100644 --- a/blog/post/2019-04-25.html +++ b/blog/post/2019-04-25.html @@ -52,7 +52,7 @@ function ol() <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-06-24.html">Next 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"> @@ -118,6 +118,7 @@ for(let x of al) <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/list/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> @@ -135,7 +136,8 @@ for(let x of al) <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> +</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. @@ -396,7 +398,7 @@ Drums <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 below.</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> diff --git a/blog/post/2020-11-20.html b/blog/post/2020-11-20.html new file mode 100644 index 0000000..be8b8b3 --- /dev/null +++ b/blog/post/2020-11-20.html @@ -0,0 +1,1507 @@ +<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">EDIROL SD-80: The Adventure Continues</h3></a></li> + <li><span>Tags</span> + <ul id="tagslist"> + <li><a href="/blog/list/device-review/">device-review</a></li><li><a href="/blog/list/midi/">midi</a></li><li><a href="/blog/list/music/">music</a></li></ul> + </li> + <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> + <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> + </ul> + </div> + <div id="content"> + <h2 id="titleh" class="TText" style="font-wight:normal;">EDIROL SD-80: The Adventure Continues</h2> + <div id="datetags" class="TText" style="margin-bottom:1em;">2020-11-20<br>#device-review #midi #music</div> + <hr><div id="article" class="TText"><script> +window.addEventListener("DOMContentLoaded",function(){ +const cl=document.querySelectorAll('div.collapse'); +let n=0; +for(let x of cl) +{ + const d=document.createElement('blockquote'); + const dd=x.cloneNode(true); + x.parentNode.insertBefore(d,x); + x.parentNode.removeChild(x); + dd.id=`cc${n++}`; + dd.style.display='none'; + const s=document.createElement('span'); + const b=document.createElement('b'); + const a=document.createElement('a'); + a.classList.add('ca'); + a.setAttribute('x',n-1); + a.innerHTML='show'; + a.href='javascript:void(0)'; + b.innerHTML=dd.getAttribute('caption'); + s.appendChild(b); + s.appendChild(document.createTextNode(' [')); + s.appendChild(a); + s.appendChild(document.createTextNode(']')); + d.appendChild(s); + d.appendChild(dd); + a.onclick=function() + { + let x='none'; + if(a.innerHTML=='show') + { + a.innerHTML='hide'; + x='block'; + } + else + { + a.innerHTML='show' + } + document.getElementById(`cc${a.getAttribute('x')}`).style.display=x; + } +} +const al=document.querySelectorAll('audio'); +n=0; +for(let x of al) +{ + x.id=`a${n++}`; + x.onplay=function() + { + for(let x of al) + { + if(x.id!=this.id)x.pause(); + } + } +} +}); +</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 procratination</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> +</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> +<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> +<div class="collapse" data-caption="Updated list of integrated circuit chips on SD-80 main board"> +<table> +<colgroup> +<col style="width: 8%"> +<col style="width: 18%"> +<col style="width: 21%"> +<col style="width: 51%"> +</colgroup> +<thead> +<tr class="header"> +<th style="text-align: center;">Label</th> +<th style="text-align: center;">Engravement</th> +<th style="text-align: center;">Model</th> +<th style="text-align: center;">Description</th> +</tr> +</thead> +<tbody> +<tr class="odd"> +<td style="text-align: center;">IC 1</td> +<td style="text-align: center;">62292 361</td> +<td style="text-align: center;">M62292FP-D60J</td> +<td style="text-align: center;">Regulator</td> +</tr> +<tr class="even"> +<td style="text-align: center;">IC 2</td> +<td style="text-align: center;">6417706 SH3 BC13008 133 0413</td> +<td style="text-align: center;">HD6417706</td> +<td style="text-align: center;">SH3 CPU</td> +</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</td> +<td style="text-align: center;">16Mbit Flash Memory</td> +</tr> +<tr class="even"> +<td style="text-align: center;">IC 4, IC 6</td> +<td style="text-align: center;">SANYO LC381616IET-70 KZA7G0CD1 0042</td> +<td style="text-align: center;">SDRAM LC3816161ET-70-TLM</td> +<td style="text-align: center;">16Mbit SDRAM (System RAM)</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">IC 5, IC 37</td> +<td style="text-align: center;">‘H5’ or ‘115’ (illegible)</td> +<td style="text-align: center;">TC7SH04FU</td> +<td style="text-align: center;">Inverter</td> +</tr> +<tr class="even"> +<td style="text-align: center;">IC 7</td> +<td style="text-align: center;">4D46 LV 00A</td> +<td style="text-align: center;">HD74LV00A</td> +<td style="text-align: center;">NAND Gate</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">IC 8, IC 20, IC 22~25</td> +<td style="text-align: center;">4C1Y LV 245A</td> +<td style="text-align: center;">HD74LV245A</td> +<td style="text-align: center;">8-bit Transceiver</td> +</tr> +<tr class="even"> +<td style="text-align: center;">IC 9, IC 11</td> +<td style="text-align: center;">F P42AB VT245A</td> +<td style="text-align: center;">74VHCT245A</td> +<td style="text-align: center;">8-bit Transceiver</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">IC 10, IC 12</td> +<td style="text-align: center;">0431H LVXC3245</td> +<td style="text-align: center;">TC74LVXC3245FS</td> +<td style="text-align: center;">Configurable 8-bit Transceiver</td> +</tr> +<tr class="even"> +<td style="text-align: center;">IC 13</td> +<td style="text-align: center;">VHC T139A 4 23</td> +<td style="text-align: center;">TC74VHCT139AFT</td> +<td style="text-align: center;">Dual 2/4 Decoder</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">IC 14</td> +<td style="text-align: center;">‘H12’ or ‘H2’ (illegible)</td> +<td style="text-align: center;">TC7SH08FU</td> +<td style="text-align: center;">AND Gate</td> +</tr> +<tr class="even"> +<td style="text-align: center;">IC 15</td> +<td style="text-align: center;">4D36 LV 04A</td> +<td style="text-align: center;">HD74LV04A</td> +<td style="text-align: center;">Hex Inverter</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">IC 16</td> +<td style="text-align: center;">4D16 LV 14A</td> +<td style="text-align: center;">HD74LV14A</td> +<td style="text-align: center;">Hex Schmitt-Trigger Inverter</td> +</tr> +<tr class="even"> +<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> +</tr> +<tr class="odd"> +<td style="text-align: center;">IC 18</td> +<td style="text-align: center;">VH3 139 4 24</td> +<td style="text-align: center;">TC74VHC139FT</td> +<td style="text-align: center;">Dual 2/4 Decoder</td> +</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;">TC223C660CF-503</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> +<td style="text-align: center;">7WU04 4.F</td> +<td style="text-align: center;">TC7WU04FU</td> +<td style="text-align: center;">Inverter</td> +</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;">GM71C18163CJ-6</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;">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;">UPD23C128040ALGY-***-MKH</td> +<td style="text-align: center;">128Mbit Mask ROM (Wave ROM)</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">IC 31, IC 35</td> +<td style="text-align: center;">4570 431</td> +<td style="text-align: center;">UPC4570G2</td> +<td style="text-align: center;">Operational Amplifiers</td> +</tr> +<tr class="even"> +<td style="text-align: center;">IC 32, IC 34</td> +<td style="text-align: center;">PCM1716E 27ZDHFM</td> +<td style="text-align: center;">PCM1716E</td> +<td style="text-align: center;">DAC</td> +</tr> +<tr class="odd"> +<td style="text-align: center;">IC 33</td> +<td style="text-align: center;">04 16H TC9271FS</td> +<td style="text-align: center;">TC9271FS</td> +<td style="text-align: center;">Digital Audio Modulator/Transmitter</td> +</tr> +<tr class="even"> +<td style="text-align: center;">IC 36</td> +<td style="text-align: center;">A E</td> +<td style="text-align: center;">TA78L05F</td> +<td style="text-align: center;">Regulator</td> +</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> +</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> +<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 +</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 +</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> +<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 +</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 randoming probing around with my multimeter on the volume board. I “accidentally” shorted the first two pins of the connecter 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> +<div style="text-align:center;max-width:90%;"> +<a href="//filestorage.chrisoft.org/blog/img/sdp2_volbrd_fixattempt.jpg"><img style="width: 50%;" src="//filestorage.chrisoft.org/blog/img/ssbsthumb_1536x1536_sdp2_volbrd_fixattempt.jpg"></a> <br>My terrible SMD soldering +</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 disassemblying 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 slient, the offset might differ from the offset when the signal was slient 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> +<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>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> +<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> +<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> +<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 +<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> +</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, gettings 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 charistics 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> +<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 hightest 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 wraping, 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> +<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 indestructive 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>AMEDLEY.MID by Earl Gray Fowler from Voyetra Technologies, arranged for SD-80 (Native Mode)</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> +<p>YOSEMITE.MID by Passport Designs, arranged for SD-80 (Native Mode)</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. 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> +<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> +</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> +<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> +<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> +<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 relase 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> +<td> +SD-80 +</td> +<td> +XV-5080 VST +</td> +</tr> +<tr> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/passport_Driving.sd_pretending_to_be_xv.ogg"> +</audio> +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/passport_Driving.xvvst.ogg"> +</audio> +</td> +</tr> +<tr> +<td> +SD-80 using patch parameters pulled from XV-5080 +</td> +<td> + 5 instances of XV-5080 VST using factory patches +</td> +</tr> +<tr> +<td colspan="2"> +“Driving”, by Passport Designs +</td> +</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> +<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> +<li>SD-90</li> +<li>SD-80</li> +<li>SD-20</li> +<li>SC-8850</li> +<li>SC-D70 (courtesy of Palto)</li> +<li>SC-55 (courtesy of Palto)</li> +<li>SC-55mkII (courtesy of Palto)</li> +<li>Fantom-XR</li> +<li>XV-5080</li> +</ul> +<p>Others come from service notes.</p> +<table> +<tbody><tr> +<th> +Model +</th> +<th> +Synth Tone Generator +</th> +<th> +Effects Processor +</th> +<th> +Wave ROM +</th> +<th> +CPU +</th> +<th> +Multitimbral Parts +</th> +<th> +Polyphony (partials / voices) +</th> +<th> +Preset Patches +</th> +<th> +Synth Effects +</th> +</tr> +<tr> +<td> +MT-32 +</td> +<td> +MB87136A (LA32) +</td> +<td> +HG61H20R36F (Reverb), 4*64Kbit RAM +</td> +<td> +4 Mbit = 0.5 MiB +</td> +<td> +Intel 8098 +</td> +<td> +9 +</td> +<td> +32 +</td> +<td> +128i + 30r +</td> +<td> +Reverb +</td> +</tr> +<tr> +<td> +JD-990 +</td> +<td> +MB87731A (EP) + MB87424A (TVF) +</td> +<td> +2 * TC6088AF (CSP), 4 Mbit RAM +</td> +<td> +3 * 16 Mbit = 6 MiB +</td> +<td> +H8/570 +</td> +<td> +8 +</td> +<td> +24 +</td> +<td> +128i + 2r + 32p +</td> +<td> +JD Multi (EQ + Dist + Phaser + Spectrum + Enhancer + Chorus + Delay + Reverb) +</td> +</tr> +<tr> +<td> +SC-55 +</td> +<td> +24201F002, TC24SC201AF-002 (GP) +</td> +<td> +Integrated, 256 Kbit RAM +</td> +<td> +3 * 8 Mbit = 3 MiB +</td> +<td> +H8/532 +</td> +<td> +16 +</td> +<td> +24 +</td> +<td> +317i + 10r +</td> +<td> +Reverb, Chorus +</td> +</tr> +<tr> +<td> +SC-55MkII +</td> +<td> +TC6116AF (GP4) +</td> +<td> +Integrated, 256 Kbit RAM +</td> +<td> +16 Mbit + 8 Mbit = 3 MiB +</td> +<td> +H8/532 +</td> +<td> +16 +</td> +<td> +28 +</td> +<td> +354i + 10r +</td> +<td> +Reverb, Chorus +</td> +</tr> +<tr> +<td> +JV-880 +</td> +<td> +TC6116AF (GP4) +</td> +<td> +Integrated, 256 Kbit RAM +</td> +<td> +2 * 16 Mbit = 4 MiB, expandable w/ SR-JV80 boards & PN-JV80 / SO-PCM cards +</td> +<td> +H8/532 +</td> +<td> +8 +</td> +<td> +28 +</td> +<td> +192i + 3r + 48p +</td> +<td> +Reverb, Chorus +</td> +</tr> +<tr> +<td> +SC-88 +</td> +<td> +MBCS30109 (XP) +</td> +<td> +Integrated, 2 * 1 Mbit RAM +</td> +<td> +4 * 16 Mbit = 8 MiB +</td> +<td> +H8/510 +</td> +<td> +32 +</td> +<td> +64 +</td> +<td> +654i + 24r +</td> +<td> +Reverb, Chorus, Delay, EQ +</td> +</tr> +<tr> +<td> +JV-1080 +</td> +<td> +MBCS30109B (XP) +</td> +<td> +Integrated, 2 * 1 Mbit RAM +</td> +<td> +4 * 16 Mbit = 8 MiB, expandable w/ SR-JV80 boards & PN-JV80 / SO-PCM cards +</td> +<td> +HD6477034, SH7034 (SH1) +</td> +<td> +16 +</td> +<td> +64 +</td> +<td> +512i + 8r + 64p +</td> +<td> +Reverb, Chorus, EFX (40 types) +</td> +</tr> +<tr> +<td> +SC-88VL +</td> +<td> +MB87B105PF-G RHR-2342 (XP2) <a id="n12" href="#note12" class="note">[12]</a> +</td> +<td> +Integrated, 2 * 1 MBit RAM +</td> +<td> +4 * 16 Mbit = 8 MiB +</td> +<td> +H8/510 +</td> +<td> +32 +</td> +<td> +64 +</td> +<td> +654i + 24r +</td> +<td> +Reverb, Chorus, Delay, EQ +</td> +</tr> +<tr> +<td> +SC-88Pro +</td> +<td> +TC170C200AF-005, RA01-005 (XP3), 2 * 1 MBit RAM +</td> +<td> +MB87837PF, 1 MBit RAM +</td> +<td> +5 * 32 Mbit = 20 MiB +</td> +<td> +H8/510 +</td> +<td> +32 +</td> +<td> +64 +</td> +<td> +1117i + 42r +</td> +<td> +Reverb, Chorus, Delay, EQ, EFX (64 types) +</td> +</tr> +<tr> +<td> +JV-2080 +</td> +<td> +TC170C200AF-005, RA01-005 (XP3), 4 MBit RAM +</td> +<td> +TC170C110AF-002, RA03-002, 4 MBit + 1 MBit RAM +</td> +<td> +2 * 32 Mbit = 8 MiB, expandable w/ SR-JV80 boards +</td> +<td> +HD6437034, SH7034 (SH1) +</td> +<td> +16 +</td> +<td> +64 +</td> +<td> +640i + 10r + 64p +</td> +<td> +Reverb, Chorus, EFX (3 slots, 40 types) +</td> +</tr> +<tr> +<td> +SC-8850 +</td> +<td> +2 * TC203C180AF-002, RA09-002 (XP6), 2 * 4 MBit RAM +</td> +<td> +MB87837PF, 4 MBit RAM +</td> +<td> +2 * 128 Mbit = 32 MiB +</td> +<td> +HD6437016E09F, SH7016 (SH2) <a id="n13" href="#note13" class="note">[13]</a> +</td> +<td> +64 +</td> +<td> +128 +</td> +<td> +1640i + 63r +</td> +<td> +Reverb, Chorus, Delay, EQ, EFX (64 types) +</td> +</tr> +<tr> +<td> +SC-8820 +</td> +<td> +TC203C180AF-002, RA09-002 (XP6), 4 MBit RAM +</td> +<td> +MB87837PF, 4 MBit RAM +</td> +<td> +128 Mbit + 64 Mbit = 24 MiB +</td> +<td> +HD64F7017F28, SH7017 (SH2) +</td> +<td> +32 +</td> +<td> +64 +</td> +<td> +1608i + 63r +</td> +<td> +Reverb, Chorus, Delay, EQ, EFX (64 types) +</td> +</tr> +<tr> +<td> +SC-D70 +</td> +<td> +TC203C180AF-002, RA09-002 (XP6), 4 MBit RAM +</td> +<td> +MB87837PF, 4 MBit RAM; TC223C080AF-101, RA0A-101 (ESP4), 4 Mbit RAM +</td> +<td> +128 Mbit + 64 Mbit = 24 MiB +</td> +<td> +HD6437016E19F, SH7016 (SH2) +</td> +<td> +32 +</td> +<td> +64 +</td> +<td> +1608i + 63r +</td> +<td> +Reverb, Chorus, Delay, EQ, EFX (64 types) +</td> +</tr> +<tr> +<td> +XV-3080 +</td> +<td> +2 * TC203C180AF-002, RA09-002 (XP6) +</td> +<td> +Integrated, 2 * 4 MBit RAM +</td> +<td> +2 * 128 Mbit = 32 MiB, expandable w/ SRX & SR-JV80 boards +</td> +<td> +HD6437042F33, SH7042 (SH2) +</td> +<td> +16 +</td> +<td> +128 +</td> +<td> +1024i + 16r + 64p +</td> +<td> +Reverb, Chorus, MFX (1 slot, 63 types) +</td> +</tr> +<tr> +<td> +JV-1010 +</td> +<td> +TC203C180AF-002, RA09-002 (XP6) +</td> +<td> +Integrated, 4 MBit RAM +</td> +<td> +2 * 64 Mbit = 16 MiB, expandable w/ SR-JV80 boards +</td> +<td> +HD6437016F28, SH7016 (SH2) +</td> +<td> +16 +</td> +<td> +64 +</td> +<td> +895i + 18r + 64p +</td> +<td> +Reverb, Chorus, EFX (40 types) +</td> +</tr> +<tr> +<td> +SD-80 +</td> +<td> +2 * TC223C660CF-503, RA08-503 (XV) +</td> +<td> +Integrated, 2 * 16 Mbit RAM +</td> +<td> +2 * 128 Mbit = 32 MiB +</td> +<td> +HD6417706, SH7706 (SH3) +</td> +<td> +32 +</td> +<td> +128 +</td> +<td> +1050i + 30r +</td> +<td> +Reverb, Chorus, EQ, MFX (3 slots, 90 types) +</td> +</tr> +<tr> +<td> +SD-90 +</td> +<td> +2 * TC223C660CF-503, RA08-503 (XV) +</td> +<td> +Integrated, 2 * 16 Mbit RAM; RA0B-B01 for AFX +</td> +<td> +2 * 128 Mbit = 32 MiB +</td> +<td> +HD6417709A, SH7709 (SH3) +</td> +<td> +32 +</td> +<td> +128 +</td> +<td> +1050i + 30r +</td> +<td> +Reverb, Chorus, EQ, MFX (3 slots, 90 types) +</td> +</tr> +<tr> +<td> +SD-20 +</td> +<td> +TC203C180AF-003, RA0C-003 (XP7) +</td> +<td> +Integrated, 4 Mbit RAM +</td> +<td> +2 * 128 Mbit = 32 MiB +</td> +<td> +HD6437016E29FV, SH7016 (SH2) +</td> +<td> +32 +</td> +<td> +64 +</td> +<td> +660i + 23r +</td> +<td> +Reverb, Chorus +</td> +</tr> +<tr> +<td> +XV-5080 +</td> +<td> +2 * TC223C660CF-503, RA08-503 (XV) +</td> +<td> +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) +</td> +<td> +HD6437042A13F, SH7042 (SH2) +</td> +<td> +32 +</td> +<td> +128 +</td> +<td> +1152i + 23r + 64p +</td> +<td> +Reverb, Chorus, EQ, MFX (3 slots, 90 types) +</td> +</tr> +<tr> +<td> +XV-5050 +</td> +<td> +TC223C660CF-503, RA08-503 (XV) +</td> +<td> +Integrated, 16 Mbit RAM +</td> +<td> +2 * 128 Mbit = 32 MiB (expandable w/ SRX boards) +</td> +<td> +HD6437016E22, SH7016 (SH2) +</td> +<td> +16 +</td> +<td> +64 +</td> +<td> +1280i + 25r + 64p +</td> +<td> +Reverb, Chorus, EQ, MFX (3 slots with restrictions <a id="n14" href="#note14" class="note">[14]</a>, 90 types) +</td> +</tr> +<tr> +<td> +XV-2020 +</td> +<td> +TC203C180AF-003, RA0C-003 (XP7) +</td> +<td> +Integrated, 4 Mbit RAM +</td> +<td> +2 * 128 Mbit = 32 MiB (expandable w/ SRX boards) +</td> +<td> +HD6437016E, SH7016 (SH2) +</td> +<td> +16 +</td> +<td> +64 +</td> +<td> +768i + 17r + 64p +</td> +<td> +Reverb, Chorus, MFX (1 slot, 40 types) +</td> +</tr> +<tr> +<td> +Fantom S-88 +</td> +<td> +TC223C660CF-503, RA08-503 (XV), 4 Mbit RAM +</td> +<td> +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) +</td> +<td> +HD6417706, SH7706 (SH3) +</td> +<td> +16 +</td> +<td> +64 +</td> +<td> +904i + 41r + 64p +</td> +<td> +Reverb, Chorus, MFX (3 slots, 78 types), Mastering & Input Effects +</td> +</tr> +<tr> +<td> +Fantom XR/X6/X7/X8 +</td> +<td> +T6TV2TBG-0002 (WX) +</td> +<td> +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) +</td> +<td> +HD6417706, SH7706 (SH3) +</td> +<td> +16 +</td> +<td> +128 +</td> +<td> +1280i + 49r + 64p +</td> +<td> +Reverb, Chorus, MFX (3 slots, 78 types), Mastering & Input Effects +</td> +</tr> +<tr> +<td> +Fantom G6/G7/G8 +</td> +<td> +T6TV2TBG-0002 (WX) +</td> +<td> +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)) +</td> +<td> +SH7785 (SH4A) +</td> +<td> +16 +</td> +<td> +128 +</td> +<td> +1920i + 73r + 8p +</td> +<td> +Reverb, Chorus, PFX (16 slots, one per channel, 76 types), MFX (2 slots, 78 types), Mastering & Input Effects +</td> +</tr> +<tr> +<td> +INTEGRA-7 +</td> +<td> +R8A02021ABG (SSC7, CPU w/ integrated DSP?) + MB8AA4181 (ESC2) +</td> +<td> +ESC2 256Mbit Effect RAM + SSC7 64Mbit Effect RAM +</td> +<td> +3 * 1Gbit = 384MiB (w/ 4 * 256Mbit = 128MiB DRAM) +</td> +<td> +R8A02021ABG (SSC7), SH4? +</td> +<td> +16 +</td> +<td> +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)--> +</td> +<td> +Reverb, Chorus, MFX (16 slots, 67 types), EQ, compressor (drum part), Surround, Mastering (EQ) +</td> +</tr> +</tbody></table> +</div> +<p>The following section summerizes generation-over-generation improvements of the synth engine noticed by me reading the manuals. It is <strong>not</strong> based on analysis of the actual chip, but instead 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.</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 referrred 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>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>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> +<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>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> +<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> +<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> +<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.</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.</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.</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> +<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> +</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>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>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> +<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> +<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> +<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 sounds identical to the one with the same name (“Flute Vib3 A”) 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 unrealisticly 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 intrument 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-proccessing 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> +</ul> +<h4 id="tocanch37" class="tvis">What’s the SD-20 anyway?</h4> +<p>Turns out it’s not much.</p> +<p>There’s going to be a separate article on this.</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> +<div> +<table style="position:relative;left:50%;transform:translate(-50%,0);text-align:center"> +<tbody><tr> +<th> +Patch +</th> +<th> +MFX Type +</th> +<th> +Audio demo (with MFX, then without MFX) +</th> +</tr> +<tr> +<td> +3D Crystal +</td> +<td> +Modulation Delay +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/3D_Crystal.ogg"> +</audio> +</td> +</tr> +<tr> +<td> +96 Year +</td> +<td> +Rotary +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/96_Year.ogg"> +</audio> +</td> +</tr> +<tr> +<td> +Celtic Ens +</td> +<td> +Reverb +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/Celtic_Ens.ogg"> +</audio> +</td> +</tr> +<tr> +<td> +MonoDLY Dist +</td> +<td> +Guitar Multi A +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/MonoDLY_Dist.ogg"> +</audio> +</td> +</tr> +<tr> +<td> +Oxigenizer +</td> +<td> +Keysync Flanger +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/Oxigenizer.ogg"> +</audio> +</td> +</tr> +<tr> +<td> +Quasar +</td> +<td> +Ring Modulator +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/Quasar.ogg"> +</audio> +</td> +</tr> +<tr> +<td> +Reed Romance +</td> +<td> +Enhancer +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/Reed_Romance.ogg"> +</audio> +</td> +</tr> +<tr> +<td> +Wah Ana.Clav +</td> +<td> +Stereo Auto Wah +</td> +<td> +<audio controls="" src="//filestorage.chrisoft.org/blog/data/SD-80/Wah_Ana.Clav.ogg"> +</audio> +</td> +</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="tocanch40" class="tvis">Block Diagram</h3> +<p>I made this vectorized version of SD-80’s block diagram printed on its chassis when I was bored.</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>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> +</ul> +<h2 id="tocanch43" class="tvis">References</h2> +<ul> +<li>Roland Wave Expansion Cards Edward D-tech https://www.dtech.lv/techarticles_roland_exp.html</li> +<li>Don Solaris’ ultimate Roland JV/JD/XV FAQ http://www.donsolaris.com/?p=404</li> +<li>COSM Sweetwater https://www.sweetwater.com/insync/cosm/</li> +<li>SOS Review of XV-5080 https://www.soundonsound.com/reviews/roland-xv5080</li> +<li>SOS Review of SD-90 https://www.soundonsound.com/reviews/edirol-sd90</li> +<li>SOS Review of SD-80 https://www.soundonsound.com/reviews/edirol-sd80</li> +<li>SOS Review of SC-88 https://www.soundonsound.com/reviews/roland-sc88</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 are 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></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 |