1<!DOCTYPE html><html class="appearance-auto" lang="en"><head><meta charset="UTF-8"><title>Zokhoi's blog</title><meta name="description" content="Where you dig the sea of thoughts just for an idea."><meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, initial-scale=1"><!-- Google Analytics --><!-- End Google Analytics --> 2<!-- Baidu Analytics --><!-- End Baidu Analytics --><link rel="icon" href="/image/favicon.ico"><link rel="stylesheet" href="/style/common/bulma.css"><link rel="stylesheet" href="/style/base.css"><link rel="stylesheet" href="/style/common/helper.css">
2<script src="/js/common.js"></script>
2<link rel="stylesheet" href="/style/widget-post-list.css"><meta name="generator" content="Hexo 6.3.0"></head><body class="is-flex is-flex-direction-column"><header class="header-widget is-flex-shrink-0 is-hidden-mobile"><div class="container is-fullhd is-flex is-justify-content-space-between is-align-items-center is-full-height"><section class="is-hidden-mobile is-flex-shrink-0"><h2><a href="/">Zokhoi's blog</a></h2></section><h3 class="is-hidden-mobile is-family-serif is-full-height is-flex is-align-items-center is-flex-shrink-0"></h3><aside class="is-flex-shrink-0"><h3 class="is-inline-block"><a href="/">Home</a></h3><h3 class="is-inline-block"><a href="/about">About</a></h3><h3 class="is-inline-block"><a href="/archives">Archives</a></h3></aside></div></header><header class="is-flex header-widget is-flex-shrink-0 is-align-items-center is-justify-content-center is-hidden-tablet"><h3 class="is-inline-block"><a href="/">Home</a></h3><h3 class="is-inline-block"><a href="/about">About</a></h3><h3 class="is-inline-block"><a href="/archives">Archives</a></h3></header><main><article class="post-container is-flex is-justify-content-center section container is-max-widescreen pt-4 px-2"><div class="columns is-variable is-1-tablet is-3-desktop-only is-2-widescreen is-full-width"><section class="column"><article class="post-item-card"><section class="content post-card-content p-4 pb-5"><header><a href="/tags/music"><i class="tag post-item-tag">music</i></a><a href="/tags/stems"><i class="tag post-item-tag">stems</i></a><a href="/tags/audio-engineering"><i class="tag post-item-tag">audio-engineering</i></a></header><h2 class="mt-4 mb-0 is-family-serif"><a href="/2023/06/14/obtain-vocaloid-stems/">Guide to Obtaining Vocaloid Stems</a></h2><time class="has-text-grey" datetime="2023-06-13T16:00:00.000Z">2023-06-14</time><p class="is-flex-grow-2 mt-2">This is a guide written specificially for the obtaining of Vocaloid song stems, including where to obtain them, and if none exists, how to create them. 3Clean stems 4For the best quality stems, you would want to find stems that are the cleanest and came from official sources, which ultimately should come from the artist themselves. Here are some of the sourc..</p><a class="button is-default mt-2 has-text-weight-semibold" href="/2023/06/14/obtain-vocaloid-stems/">Read more</a></section></article><article class="post-item-card"><header class="is-relative is-flex"><div class="post-cover-backdrop is-hidden"><img src="/image/mf3dre/MF3D.png" alt="loading.."></div><a class="post-cover-link has-text-centered skeleton" href="/2023/04/22/mf3dre/"><img class="post-cover-img js-img-fadeIn" src="/image/mf3dre/MF3D.png" alt="loading.." data-backdrop="true"></a></header><section class="content post-card-content p-4 pb-5"><header><a href="/tags/electronics"><i class="tag post-item-tag">electronics</i></a><a href="/tags/reverse-engineering"><i class="tag post-item-tag">reverse-engineering</i></a></header><h2 class="mt-4 mb-0 is-family-serif"><a href="/2023/04/22/mf3dre/">Midi Fighter 3D Reverse Engineering</a></h2><time class="has-text-grey" datetime="2023-04-21T16:00:00.000Z">2023-04-22</time><p class="is-flex-grow-2 mt-2"> 5Intro 6A few years ago I bought a Midi Fighter 3D from DJ TechTools. After playing with it for a while, I was interested in using it as a game controller, which involves binding buttons to keystrokes. Bomeâs Midi Translator is good, but I would like to not use a translation layer. This means I need to use a custom firmware. However, DJ TechTools have open ..</p><a class="button is-default mt-2 has-text-weight-semibold" href="/2023/04/22/mf3dre/">Read more</a></section></article></section><aside class="column is-hidden-mobile is-4-tablet is-3-widescreen"><style>.search-widget .search-input { 7 border: none; 8 outline: none; 9 background: transparent; 10 color: var(--second-text-color); 11} 12.search-widget .search-content { 13 position: absolute; 14 left: 0; 15 top: calc(100% - 3px); 16 z-index: 2; 17 18 width: 100%; 19 height: 0; 20 max-height: 550px; 21 22 overflow: auto; 23 box-sizing: border-box; 24 25 background: var(--top-bar-bg-color); 26 backdrop-filter: blur(var(--backdropFilter)); 27 -webkit-backdrop-filter: blur(var(--backdropFilter)); 28 29 border-bottom-left-radius: var(--borderRadius); 30 border-bottom-right-radius: var(--borderRadius); 31 box-shadow: 0 12px 15px rgba(0, 0, 0, 0.08); 32} 33 34.search-widget .search-content a:hover h5 { 35 color: #3273dc!important; 36} 37</style><main class="aside-card-container search-widget is-relative"><label for="searchInput"><div class="is-flex px-4" id="searchButton"><i class="fa-solid fa-magnifying-glass"></i><input class="search-input is-flex-grow-1" id="searchInput" placeholder="Search everything.."></div></label><section class="search-content content" id="searchContent"></section></main>
37<script>var searchDatabase = [] 38var searchInputEl = document.getElementById('searchInput') 39var searchButtonEl = document.getElementById('searchButton') 40var searchResultEl = document.getElementById('searchContent') 41 42searchInputEl.oninput = function (evt) { 43 var searchValue = evt.srcElement.value 44 var haveSearchValue = Boolean(searchValue.trim()) 45 if (!haveSearchValue) { 46 searchResultEl.style.height = 0 47 searchResultEl.innerHTML = null 48 return 49 } 50 51 var searchResults = searching(searchValue) 52 53 if (searchResults.length > 0) { 54 renderSearchResults(searchResults) 55 } 56} 57 58function renderSearchResults(results) { 59 searchResultEl.innerHTML = null 60 var fragment = document.createDocumentFragment() 61 62 results.forEach(function (item) { 63 var link = document.createElement('a') 64 var title = document.createElement('h5') 65 var content = document.createElement('p') 66 67 title.className = 'mb-1' 68 title.innerText = item.title 69 content.innerText = item.content 70 71 link.href = item.link 72 link.appendChild(title) 73 link.appendChild(content) 74 link.className = 'p-4 is-block' 75 76 fragment.appendChild(link) 77 }) 78 79 searchResultEl.appendChild(fragment) 80 searchResultEl.style.height = 'auto' 81} 82 83function searching(inputText) { 84 var inputTexts = inputText.split(' ') 85 var searchResults = []
86 inputTexts.forEach(function (searchKey) { 87 var haveSearchValue = Boolean(searchKey.trim()) 88 if (!haveSearchValue) return 89 90 var key = searchKey.toLowerCase() 91 92 for (var entry of searchDatabase) { 93 var title = entry.getElementsByTagName('title')[0].textContent 94 var link = entry.getElementsByTagName('link')[0].getAttribute('href') 95 var contentWithTags = entry.getElementsByTagName('content')[0].textContent 96 var rawContent = contentWithTags.trim().replace(/<[^>]+>/g, '').toLowerCase() 97 98 var LENGTH = 80 99 var finalContent = '' 100 var contentLength = rawContent.length 101 var searchResultIdx = rawContent.indexOf(key) 102 103 var startIdx = searchResultIdx - 20, 104 endIdx = startIdx + LENGTH 105 106 if (startIdx < 0) { 107 startIdx = 0 108 endIdx = 100 109 } 110 111 endIdx > contentLength && (endIdx = contentLength) 112 113 finalContent = rawContent.substring(startIdx, endIdx) 114 115 if (title.indexOf(key) > -1 || searchResultIdx > -1) { 116 searchResults.push({ 117 link: link, 118 title: title, 119 content: finalContent 120 }) 121 } 122 } 123 }) 124 return searchResults 125} 126 127searchButtonEl.onclick = function () { 128 if (searchDatabase.length > 0) return; 129 130 fetch(window.location.href + '/search.xml').then(res => res.text()).then(res => { 131 var domparser = new DOMParser 132 var doc = domparser.parseFromString(res, 'application/xml') 133 searchDatabase = doc.getElementsByTagName('search')[0].children 134 }) 135}</script>
135<main class="aside-card-container profile-widget"><!-- todo: 使ç¨åè²å·¥å
·å¨æé´å½±--><section class="is-flex is-flex-direction-column is-justify-content-center is-align-items-center"><section class="is-flex is-justify-content-center avatar is-clipped skeleton"><!-- debug images "https://api.ixiaowai.cn/gqapi/gqapi.php"--><img class="js-img-fadeIn" src="/image/zokhoi.svg" alt="user avatar"></section><h3 class="user-name">Zokhoi</h3><div class="has-text-centered is-relative"><span style="margin-bottom: 5px;">Where you dig the sea of thoughts just for an idea.</span></div></section><section class="sns-container is-flex is-justify-content-center is-align-items-center"><!-- Github--><a title="github" target="_blank" rel="noopener nofollow" href="//github.com/Zokhoi"><i class="fa fa-brands fa-github"></i></a><!-- Instagram--><!-- RSS--><!-- ç¥ä¹--><!-- LinkedIn--><!-- Facebook--><!-- ko-fi--><a title="ko-fi" target="_blank" rel="noopener nofollow" href="//ko-fi.com/Zokhoi"><i class="fa fa-solid fa-mug-saucer"></i></a><!-- liberapay--><a title="liberapay" target="_blank" rel="noopener nofollow" href="//liberapay.com/Zokhoi"><i class="fa fa-solid fa-circle-dollar-to-slot"></i></a></section></main><main class="aside-card-container recent-widget"><h3>Recent</h3><ul><li class="is-flex"><!-- change to element replace image placeholder--><img class="js-img-fadeIn" src="https://ui-avatars.com/api/?background=f5f5f5&name=Gu" alt="cover"><!--else--><!-- div.post-img-placeholder--><section class="is-flex-grow-2"><p class="has-text-weight-semibold" style="line-height: 20px; font-size: 14px"><a href="/2023/06/14/obtain-vocaloid-stems/">Guide to Obtaining Vocaloid Stems</a></p><time class="has-text-weight-semibold has-text-grey" datetime="2023-06-13T16:00:00.000Z">2023-06-14</time></section></li><li class="is-flex"><!-- change to element replace image placeholder--><img class="js-img-fadeIn" src="/image/mf3dre/MF3D.png" alt="cover"><!--else--><!-- div.post-img-placeholder--><section class="is-flex-grow-2"><p class="has-text-weight-semibold" style="line-height: 20px; font-size: 14px"><a href="/2023/04/22/mf3dre/">Midi Fighter 3D Reverse Engineering</a></p><time class="has-text-weight-semibold has-text-grey" datetime="2023-04-21T16:00:00.000Z">2023-04-22</time></section></li></ul></main><main class="aside-card-container categories-widget category-page"><h3>Categories</h3><section><ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/electronics/">electronics</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/music/">music</a><span class="category-list-count">1</span></li></ul></section></main><main class="aside-card-container archives-widget"><h3>Archives</h3><section><ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2023/06/">June 2023</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2023/04/">April 2023</a><span class="archive-list-count">1</span></li></ul></section></main><main class="aside-card-container tag-widget"><h3>Tags</h3><section><a href="/tags/electronics"><span class="tag post-item-tag" style="margin-bottom: 5px;">electronics</span></a><a href="/tags/music"><span class="tag post-item-tag" style="margin-bottom: 5px;">music</span></a><a href="/tags/stems"><span class="tag post-item-tag" style="margin-bottom: 5px;">stems</span></a><a href="/tags/reverse-engineering"><span class="tag post-item-tag" style="margin-bottom: 5px;">reverse-engineering</span></a><a href="/tags/audio-engineering"><span class="tag post-item-tag" style="margin-bottom: 5px;">audio-engineering</span></a></section></main></aside></div></article>
135<script>$claudia.fadeInImage(null, $claudia.blurBackdropImg) 136 137window.addEventListener('resize', $claudia.throttle(function () { 138 var images = document.querySelectorAll('.js-img-fadeIn') 139 140 images.forEach($claudia.blurBackdropImg) 141}, 150))</script>
141</main><footer class="is-flex is-flex-direction-column is-align-items-center is-flex-shrink-0 is-family-serif"><section class="sns-container"><!-- Github--><a title="github" target="_blank" rel="noopener nofollow" href="//github.com/Zokhoi"><i class="fa fa-brands fa-github"></i></a><!-- Instagram--><!-- RSS--><!-- ç¥ä¹--><!-- LinkedIn--><!-- Facebook--><!-- ko-fi--><a title="ko-fi" target="_blank" rel="noopener nofollow" href="//ko-fi.com/Zokhoi"><i class="fa fa-solid fa-mug-saucer"></i></a><!-- liberapay--><a title="liberapay" target="_blank" rel="noopener nofollow" href="//liberapay.com/Zokhoi"><i class="fa fa-solid fa-circle-dollar-to-slot"></i></a></section><p><span>Copyright ©</span><span> Zokhoi 2026</span></p><div class="is-flex is-justify-content-center is-flex-wrap-wrap"><p>Powered by Hexo | </p><p class="is-flex is-justify-content-center"><a title="Hexo theme author" target="_blank" rel="noopener" href="//github.com/haojen">Theme by Haojen </a><span>and </span><a title="Hexo theme author" target="_blank" rel="noopener" href="//github.com/Zokhoi">Modified by Zokhoi </a></p><div style="margin-top: 2px"><a class="github-button" title="github-button" target="_blank" rel="noopener" href="https://github.com/haojen/hexo-theme-Claudia" data-color-scheme="no-preference: light; light: light; dark: dark;" data-show-count="true"></a></div></div><div><span></span></div></footer>
141<script async defer src="https://buttons.github.io/buttons.js"></script>
141<script>$claudia.fadeInImage(null, $claudia.blurBackdropImg) 142 143window.addEventListener('resize', $claudia.throttle(function () { 144 var images = document.querySelectorAll('.js-img-fadeIn') 145 146 images.forEach($claudia.blurBackdropImg) 147}, 150))</script>
147<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"74bb2159a1eb42a7a371d802a8b25c97","r":1,"spa":2}' crossorigin="anonymous"></script>
147 148</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.