Fix <sql> silent-failure bug; split /vst into overview + subpage; misc site fixes

- __mysql.cpp: <sql> never checked mysql_real_query's own return code,
  so a genuine query failure was indistinguishable from "ran fine, zero
  rows" - <try>/<catch> around a failing <sql> never actually caught
  anything anywhere. Now throws on a real failure.
- spa.js: dynamically re-injected scripts now run in true sequential
  order (wait for each external script's load event before running the
  next), fixing checkout's Square card field never building on the
  first client-side navigation to /checkout (only after a refresh) -
  async=false alone only orders multiple external scripts relative to
  each other, it doesn't delay a plain inline sibling.
- /vst split into a real overview + /vst/modular1 subpage with a left
  menu, reusing opensource.page's existing subpage-tier pattern
  (opensource.menu/main.css's submenuitem-active highlighting, and
  several other subpage-tier retirements, were already finished earlier
  this session but never committed - included here too).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Brad ArantandClaude Sonnet 5 committed 2026-09-13 15:14:25 +00:00
1 parent 46ef67b735
commit 905fbafa5a
17 files changed
+465 -54

No files matched your search

+12
View File
@@ -157,6 +157,18 @@ namespace jet {
void __mysql::query(coreutils::MString query) { void __mysql::query(coreutils::MString query) {
int rc = mysql_real_query(mysql, query.getData(), query.getLength()); int rc = mysql_real_query(mysql, query.getData(), query.getLength());
// rc was captured but never checked - a genuinely failed query
// (syntax error, constraint violation, etc.) fell straight into
// the result==NULL branch below, which is ALSO the normal path
// for a successful non-SELECT statement (INSERT/UPDATE/DELETE
// have no result set to store either). That made every SQL error
// in the whole codebase silently indistinguishable from "ran fine,
// no rows" - <try>/<catch> around a failing <sql> never caught
// anything, since no exception was ever thrown in the first place.
// Only rc (mysql_real_query's own success/failure signal) can
// actually tell the two cases apart; result's nullness can't.
if(rc != 0)
throw coreutils::Exception(std::string("mysql query failed: ") + mysql_error(mysql));
result = mysql_store_result(mysql); result = mysql_store_result(mysql);
if(result) { if(result) {
row = mysql_fetch_row(result); row = mysql_fetch_row(result);
+18
View File
@@ -365,6 +365,24 @@ textarea.fieldinputerror {
transition: color 0.2s ease, border-color 0.2s ease; transition: color 0.2s ease, border-color 0.2s ease;
} }
/* The currently-active entry in a page's own sidebar submenu (e.g.
opensource.menu's list of subpages) - a background highlight rather
than baritemselected's "raised tab" treatment, since these are plain
inline links stacked in a list, not tabs sitting on a bar edge.
Applied server-side (see opensource.menu) by comparing each
linkbutton's own subpage against $[SUBPAGE] - spa.js already
re-renders and swaps this menu's markup on every client-side
navigation (see its #_spa_panelmenu handling), so this stays correct
without any script of its own. */
.submenuitem-active {
background: var(--bond-panel-2);
color: var(--bond-gold-bright) !important;
padding: 2px 6px;
margin: -2px -6px;
border-radius: 3px;
box-shadow: inset 0 0 0 1px var(--bond-gold);
}
.panel { .panel {
background: var(--bond-panel); background: var(--bond-panel);
margin: 10px; margin: 10px;
+30 -6
View File
@@ -127,19 +127,43 @@
// a client-side SPA swap (e.g. clicking "Check Out") instead of a // a client-side SPA swap (e.g. clicking "Check Out") instead of a
// full reload; only worked by accident on a fresh /checkout load. // full reload; only worked by accident on a fresh /checkout load.
// Re-creating each script element makes the browser actually run // Re-creating each script element makes the browser actually run
// it. async=false on src="" ones preserves normal in-order // it. A prior fix set async=false on src="" ones, but that only
// execution (dynamically-inserted external scripts default to // orders MULTIPLE external scripts relative to each other - it
// async otherwise), matching how a real page load would run them. // does nothing to delay a plain inline script sitting right after
// one, which still runs immediately on insertion regardless of a
// sibling's in-flight fetch. checkout.page is exactly that shape
// (an external Square SDK <script src> immediately followed by an
// inline script calling Square.payments(...)): on a client-side
// SPA swap the inline script ran before Square had actually
// finished downloading, throwing "Square is not defined" inside an
// async function with no visible catch, leaving the card container
// permanently empty - reported as "checkout's card field doesn't
// build the first time, only after a refresh" (a real full page
// load's parser-inserted <script src> blocks until loaded before
// the next tag runs, which a dynamically re-created one does not
// do on its own). Fixed by actually waiting for each external
// script's load/error event before moving on to the next one,
// rather than trusting async=false's narrower ordering guarantee -
// reproduced the failure and confirmed the fix against a real
// artificially-delayed script load before deploying.
var scripts = content.querySelectorAll('script'); var scripts = content.querySelectorAll('script');
for (var i = 0; i < scripts.length; i++) { var scriptList = [];
var old = scripts[i]; for (var i = 0; i < scripts.length; i++) scriptList.push(scripts[i]);
(function runScript(index) {
if (index >= scriptList.length) return;
var old = scriptList[index];
var fresh = document.createElement('script'); var fresh = document.createElement('script');
for (var j = 0; j < old.attributes.length; j++) for (var j = 0; j < old.attributes.length; j++)
fresh.setAttribute(old.attributes[j].name, old.attributes[j].value); fresh.setAttribute(old.attributes[j].name, old.attributes[j].value);
if (fresh.src) fresh.async = false;
fresh.textContent = old.textContent; fresh.textContent = old.textContent;
if (fresh.src) {
fresh.onload = fresh.onerror = function() { runScript(index + 1); };
old.parentNode.replaceChild(fresh, old); old.parentNode.replaceChild(fresh, old);
} else {
old.parentNode.replaceChild(fresh, old);
runScript(index + 1);
} }
})(0);
// #_spa_panelmenu carries the CURRENT page's own side-menu markup // #_spa_panelmenu carries the CURRENT page's own side-menu markup
// (mainpagetemplate.jet renders it into every fragment response // (mainpagetemplate.jet renders it into every fragment response
// specifically so this can pull it out) - extracted from the // specifically so this can pull it out) - extracted from the
@@ -0,0 +1,14 @@
<page secure="yes" loggedin="yes" admin="true">
<title>ADMIN INVOICES</title>
<contents>
<eval name="_menu">
<include file="adminmenu.section">
</eval>
<retain name="invoice_id">
<h3>Invoices</h3>
<showtable page="admin_invoice" process="selectinvoice" name="invoice_id" value="X">
select invoices.id as X,invoices.id,user_id,name,invoices.created,amount,invoices.status from invoices join users on invoices.user_id=users.id
</showtable>
<br>
</contents>
</page>
@@ -0,0 +1,52 @@
<page>
<title>RCA1802 Micro-Controller Assembler/Emulator</title>
<contents>
<sectionframe title="RCA1802">
<h1>The RCA1802 Micro-Controller</h1>
<img src="/assets/rca1802chip.jpeg" align="right">
<p>Back in the 1970's RCA released a chip that was widely used in
satellites and other spacecraft to this day. It is a very simple
8-bit micro-controller with 16-bit addressibility enabling memory
access to 65,536 bytes of data.</p>
<p>The main chip is core to the COSMAC-ELF computers from the early period of
micro-controllers. Because of theyre reliability and lower clock
speeds the RCA1802 is a rugged controller for abusive environments.</p>
</sectionframe>
<sectionframe title="RCA1802 Assembler">
<p>The assembler allows the compilation of 1802 assembler language (as
defined in the chip's data reference manual) into a RAM file that is
65,536 bytes in size. This file can be loaded into the emulator which
can then be used to debug the code.</p>
<p>Output device 1 provides a console type display of ASCII characters
sent to it. Input device 1 is used to retrieve data from the keyboard
device.</p>
</sectionframe>
<sectionframe title="RCA1802 Emulator">
<img src="/assets/emu1802a.png" align="right" width="500">
<p>The 1802 emulator provides a fully functional RCA1802
micro-controller device complete with interupt handling and DMA
controls for memory access. Experiment with code structures and build
an associated kit that allows you to operate the software on real
hardware controllers.</p>
<p>The RAM for the device can be loaded from RAM file (.ram extension)
that contain 65,536 bytes of pre-assembled machine code created from
the assembler module.</p>
<p>The emulator has IDLE, RUN, STEP and DMA modes for easy code
visibility and manipulation.</p>
</sectionframe>
<sectionframe title="RCA1802 Computer Device">
We are working to provide a hardware kit for the controller device.
Current schematics are being layed out using Kicad. I have a full git
change environment going for the Kicad project as well as the source
code for the assembler and emulator components.
</sectionframe>
</contents>
</page>
@@ -0,0 +1,23 @@
<page>
<title>BARANTMAIL OPEN SOURCE PROJECT</title>
<contents>
<sectionframe title="BARANTMAIL OPEN SOURCE PROJECT">
<p>In the year 2000 I was extremely frustrated with the state of e-amil
systems available to Linux. Sendmail and q-mail were pretty much the two
mainstays. sendmail was prohibitively complex for the newly emerging
Internet method of using e-mail and q-mail was poorly maintained.</p>
<p>As a result, I embarked on a mission to write my own e-mail system that used
mysql as it's storage medium. I wanted to keep it simple and support
multiple users and domains with the simplest of configurations imaginable.
I also wanted a scalable multi-server capability.</p>
<p>The result is BARANTMAIL.</p>
<h2>Features</h2>
<p>Features of BARANTMAIL are:</p>
<ul>
<li>Fully compliant e-mail system.</li>
<li>Support for multiple domains.</li>
</ul>
<p></p>
</sectionframe>
</contents>
</page>
@@ -0,0 +1,128 @@
<page secure="yes" loggedin="yes">
<title>EMAIL</title>
<contents>
<style>
#email-connect-form { max-width: 360px; margin: 40px auto; }
#email-connect-form input { display: block; width: 100%; box-sizing: border-box; margin-bottom: 10px; padding: 6px; }
#email-connect-error { color: #a00; min-height: 1.2em; margin-bottom: 10px; }
#email-app { height: 100%; }
#email-client { display: flex; flex-direction: column; max-height: 100%; }
#email-toolbar { display: flex; align-items: center; justify-content: space-between; padding: 6px 0; border-bottom: 1pt solid var(--bond-line-soft); margin-bottom: 6px; }
#email-toolbar-actions { display: flex; align-items: center; gap: 6px; }
#email-search-box { display: flex; align-items: center; gap: 4px; margin-right: 6px; }
#email-search-input {
background: #101014; color: var(--bond-text);
border: 1px solid var(--bond-line-soft); border-radius: 4px;
padding: 4px 8px; font-size: 9pt; width: 150px;
}
#email-search-input:focus {
outline: none; border-color: var(--bond-gold-bright);
box-shadow: 0 0 0.6em rgba(197, 164, 90, 0.5), 0 0 0.2em rgba(227, 196, 126, 0.55);
}
#email-list-count { color: var(--bond-text-dim); font-size: 9pt; margin-left: 6px; }
#email-layout { display: flex; flex: 1; min-height: 0; }
#email-list { width: 340px; flex-shrink: 0; overflow-y: auto; border-right: 1pt solid var(--bond-line-soft); transition: opacity 0.18s ease; }
#email-reading-pane { flex: 1; min-width: 0; overflow-y: auto; padding: 0 12px; transition: opacity 0.18s ease; }
.email-fading { opacity: 0; }
.email-row {
display: flex; align-items: center; gap: 6px; padding: 8px 10px 8px 13px;
border-bottom: 1pt solid var(--bond-line-soft); border-left: 3px solid transparent; cursor: pointer;
overflow: hidden;
transition: opacity 0.2s ease,
height 0.22s ease 0.2s, padding-top 0.22s ease 0.2s, padding-bottom 0.22s ease 0.2s,
margin-top 0.22s ease 0.2s, margin-bottom 0.22s ease 0.2s, border-width 0.22s ease 0.2s;
}
.email-row:hover { background: rgba(255, 255, 255, 0.05); }
.email-row.unread {
font-weight: bold;
background: rgba(197, 164, 90, 0.12);
box-shadow: inset 0 0 0 1px var(--bond-gold);
}
.email-row.selected { background: rgba(197, 164, 90, 0.16); border-left-color: var(--bond-gold); }
.email-row.selected:hover { background: rgba(197, 164, 90, 0.22); }
/* Per-row removal animation for the trash button (see trashMessage()
in email.js) - dissolves in place first (the opacity transition,
no delay), then collapses its own box to nothing (the delayed
height/padding/margin/border transitions kick in once the fade is
mostly done) so every row below it slides up smoothly to close the
gap, purely as a side effect of ordinary document-flow reflow - no
other row is touched, faded, or re-rendered to make that happen. */
.email-row.email-row-removing {
opacity: 0;
height: 0 !important;
padding-top: 0; padding-bottom: 0;
margin-top: 0; margin-bottom: 0;
border-width: 0;
}
.email-row-info { flex: 1; min-width: 0; }
.email-row .email-from { font-size: 10pt; }
.email-row .email-subject { font-size: 9pt; color: var(--bond-text-dim); }
.email-row .email-date { font-size: 8pt; color: var(--bond-text-dim); }
.email-row-trash-btn { flex-shrink: 0; width: 24px; height: 24px; opacity: 0.55; }
.email-row-trash-btn svg { width: 13px; height: 13px; }
.email-row-trash-btn:hover { opacity: 1; }
#email-reading-pane .email-header { border-bottom: 1pt solid var(--bond-line-soft); margin-bottom: 10px; padding-bottom: 10px; }
#email-reading-pane .email-body { white-space: pre-wrap; overflow-wrap: break-word; word-break: break-word; font-family: monospace; font-size: 9pt; }
#email-reading-pane .email-body-frame { width: 100%; height: 520px; border: none; border-radius: 4px; background: #fff; }
#email-reading-pane .email-actions { margin-top: 10px; }
#email-empty-state { color: var(--bond-text-dim); padding: 20px; }
#email-folder-list { display: flex; flex-direction: column; }
.email-folder-link { display: flex; align-items: center; justify-content: space-between; padding: 6px 8px; margin-bottom: 2px; border-radius: 4px; text-decoration: none; color: inherit; }
.email-folder-link:hover { background: rgba(255,255,255,0.08); }
.email-folder-link.email-folder-selected { background: rgba(255,255,255,0.14); font-weight: bold; }
.email-folder-count { font-size: 8pt; padding: 1px 6px; border-radius: 8px; background: rgba(197, 164, 90, 0.25); color: var(--bond-gold-bright); }
.email-folder-count:empty { display: none; }
.icon-btn {
display: inline-flex; align-items: center; justify-content: center;
width: 30px; height: 30px; padding: 0; margin: 0; cursor: pointer;
border-radius: 6px; border: 1px solid var(--bond-gold);
background: linear-gradient(180deg, #1c1c24, #131318);
color: var(--bond-gold-bright);
box-shadow: 0 0 0.4em rgba(197, 164, 90, 0.25);
transition: box-shadow 0.2s ease, background 0.2s ease, transform 0.1s ease;
}
.icon-btn svg { width: 16px; height: 16px; display: block; }
.icon-btn:hover {
box-shadow: 0 0 0.8em rgba(197, 164, 90, 0.5), 0 0 0.25em rgba(227, 196, 126, 0.55);
background: linear-gradient(180deg, #24242e, #1a1a20);
}
.icon-btn:active { transform: scale(0.94); }
.icon-btn.icon-btn-active {
color: #131318;
background: linear-gradient(180deg, var(--bond-gold-bright), var(--bond-gold));
box-shadow: 0 0 0.7em rgba(197, 164, 90, 0.6);
}
</style>
<div id="email-app">
<if value1="$[@_imap_user]" value2="" type="eq">
<div id="email-connect-form">
<h3>Connect to Mailbox</h3>
<input type="text" id="email-user-input" placeholder="you@barant.com" autocomplete="username">
<input type="password" id="email-password-input" placeholder="Password" autocomplete="current-password">
<button type="button" id="email-connect-btn">Connect</button>
<div id="email-connect-error"></div>
</div>
<else>
<div id="email-client">
<div id="email-toolbar">
<span id="email-connected-as">$[@_imap_user]</span><span id="email-list-count"></span>
<span id="email-toolbar-actions">
<span id="email-search-box">
<input type="text" id="email-search-input" placeholder="Search mail&hellip;">
<button type="button" id="email-search-btn" class="icon-btn" title="Search"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.35-4.35"/></svg></button>
</span>
<button type="button" id="email-compose-btn" class="icon-btn" title="New Mail"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 6h13a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z"/><path d="M2.5 7.5 12 14l9.5-6.5"/><path d="M18.5 3.5v5M16 6h5"/></svg></button>
<button type="button" id="email-refresh-btn" class="icon-btn" title="Refresh"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M20 11a8 8 0 0 0-14.6-4.4M4 4v5h5"/><path d="M4 13a8 8 0 0 0 14.6 4.4M20 20v-5h-5"/></svg></button>
<button type="button" id="email-disconnect-btn" class="icon-btn" title="Disconnect"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><path d="M16 17l5-5-5-5"/><path d="M21 12H9"/></svg></button>
</span>
</div>
<div id="email-layout">
<div id="email-list"></div>
<div id="email-reading-pane"><div id="email-empty-state">Select a message to read it.</div></div>
</div>
</div>
</if>
</div>
<script src="/assets/email.js?v=20260905m"></script>
</contents>
</page>
@@ -0,0 +1,13 @@
<page>
<title>barant.com - JET Extension Tags</title>
<contents>
<if value1="$[ARGS]" value2="" type="eq">
<include file="jet_overview.section">
<else>
<set name="subpage" expr="substring('$[ARGS]', 2)">
<include file="jet_$[subpage].section">
</if>
</contents>
</page>
+2 -2
View File
@@ -72,7 +72,7 @@ $[_BODY]
<html lang="en"> <html lang="en">
<head> <head>
<title>BARANT Technology Group</title> <title>BARANT Technology Group</title>
<link rel="stylesheet" href="/assets/main.css?v=20260906a"> <link rel="stylesheet" href="/assets/main.css?v=20260908a">
<link rel="stylesheet" href="/assets/control.css?v=20260902"> <link rel="stylesheet" href="/assets/control.css?v=20260902">
</head> </head>
<body> <body>
@@ -131,7 +131,7 @@ $[_BODY]
<div id="filemgr-list"><div id="filemgr-empty">No transfers yet.</div></div> <div id="filemgr-list"><div id="filemgr-empty">No transfers yet.</div></div>
</div> </div>
</div> </div>
<script src="/assets/spa.js?v=20260906a"></script> <script src="/assets/spa.js?v=20260913a"></script>
<script src="/assets/documents.js?v=20260906a"></script> <script src="/assets/documents.js?v=20260906a"></script>
</body> </body>
</html> </html>
@@ -0,0 +1,4 @@
<sectionframe title="Git Repository">
<iframe src="https://git.barant.com" style="width:100%; height:80vh; border:1px solid var(--bond-line-soft); border-radius:3px; background:var(--bond-panel);"></iframe>
</sectionframe>
+29
View File
@@ -1,8 +1,37 @@
<sectionframe title="OPEN SOURCE PROJECTS"> <sectionframe title="OPEN SOURCE PROJECTS">
<if value1="$[SUBPAGE]" value2="" type="eq">
<linkbutton page="opensource" class="submenuitem-active">OVERVIEW</linkbutton><br>
<else>
<linkbutton page="opensource">OVERVIEW</linkbutton><br> <linkbutton page="opensource">OVERVIEW</linkbutton><br>
</if>
<if value1="$[SUBPAGE]" value2="barantmail" type="eq">
<linkbutton page="opensource" subpage="barantmail" class="submenuitem-active">BARANTMAIL</linkbutton><br>
<else>
<linkbutton page="opensource" subpage="barantmail">BARANTMAIL</linkbutton><br> <linkbutton page="opensource" subpage="barantmail">BARANTMAIL</linkbutton><br>
</if>
<if value1="$[SUBPAGE]" value2="jet" type="eq">
<linkbutton page="opensource" subpage="jet" class="submenuitem-active">JET</linkbutton><br>
<else>
<linkbutton page="opensource" subpage="jet">JET</linkbutton><br> <linkbutton page="opensource" subpage="jet">JET</linkbutton><br>
</if>
<if value1="$[SUBPAGE]" value2="synthmax" type="eq">
<linkbutton page="opensource" subpage="synthmax" class="submenuitem-active">SYNTHMAX</linkbutton><br>
<else>
<linkbutton page="opensource" subpage="synthmax">SYNTHMAX</linkbutton><br> <linkbutton page="opensource" subpage="synthmax">SYNTHMAX</linkbutton><br>
</if>
<if value1="$[SUBPAGE]" value2="serverframework" type="eq">
<linkbutton page="opensource" subpage="serverframework" class="submenuitem-active">SERVER CORE FRAMEWORK</linkbutton>
<else>
<linkbutton page="opensource" subpage="serverframework">SERVER CORE FRAMEWORK</linkbutton> <linkbutton page="opensource" subpage="serverframework">SERVER CORE FRAMEWORK</linkbutton>
</if>
<if value1="$[SUBPAGE]" value2="asm1802" type="eq">
<linkbutton page="opensource" subpage="asm1802" class="submenuitem-active">ASM/MCH 1802 SIMULATOR</linkbutton><br>
<else>
<linkbutton page="opensource" subpage="asm1802">ASM/MCH 1802 SIMULATOR</linkbutton><br> <linkbutton page="opensource" subpage="asm1802">ASM/MCH 1802 SIMULATOR</linkbutton><br>
</if>
<if value1="$[SUBPAGE]" value2="git" type="eq">
<linkbutton page="opensource" subpage="git" class="submenuitem-active">GIT REPOSITORY</linkbutton><br>
<else>
<linkbutton page="opensource" subpage="git">GIT REPOSITORY</linkbutton><br>
</if>
</sectionframe> </sectionframe>
@@ -0,0 +1,44 @@
<page>
<title>Server Core Framework</title>
<contents>
<sectionframe title="Server Core Framework">
<p>It is finally here! The Server Core Framework is now available. The
framework offers support for just about any server you can devise.</p>
<p>Now why would I want to go and build a server when there are all
sorts of frameworks out there for supporting server activity? All I
can say is top notch performance. The Server Core is all C++ and is
built on the epoll structure of the Linux operating system.</p>
<ul>
<li>TCP and/or UDP server capabilities.</li>
<li>Straight socket or TLS connections.</li>
</ul>
<p>Using the Server Core you can build out server elements for
embedded systems or massively publicly accessible servers with simple
code. Use the Server Core for:</p>
<ul>
<li>Micro-services engine for code generators.</li>
<li>Game servers of all types.</li>
<li>E-Mail services (checkout barantmail project).</li>
<li>SIP telephony server.</li>
<li>HTTP/HTTPS for embedded web sites.</li>
<li>Streaming server for online radio stations.</li>
<li>Any other TCP or UDP based server.</li>
</ul>
<p>For the game server we will be offering client modules for both
Unty 3D and for the Unreal Engine 4 with drop in and play options that
can be heavily modified to support unique game features. Offers
support for mySQL backends.</p>
<img src="/assets/ServerCoreMap.png" width="80%">
<br>
<code>
git clone https://barant.com/git@ServerCore.git
</code>
</sectionframe>
</contents>
</page>
+47
View File
@@ -0,0 +1,47 @@
<retain name="sku">
<sectionframe title="Modular1">
<sql>select * from products where sku='MODULAR1'</sql>
<div style="display: cell-column;">
<h2>$[description]</h2>
<div style="display: cell-column; margin-right: 10px;"><img style="width: 800px;" src="/assets/modular1_0.png"></div>
<p>$[text]</p></div>
<div>
<span><font size="+3">$19.<su>95</su></font></span>
</div>
<div>
<addtocart sku="$[.sku]">
</div>
<p>
Precision modular synthesizer with fully automatic patching and
polyphony in one VST instrument. 12 module types provide a rich
synthesis structural capability providing FM, additive and subtractive
methods of creating musical instrumentation using traditional modular
synthsis methods. 2 filter types provide both a Korg sound as well as
the old popular Moog Filter sound.
<ul>
<li>6 full spectrum voltage controlled oscillators with sine,
triangle, saw, pulse with modulation, pink noise, white noise. Sync
and phase modulation for DX7 style FM synthesis. Wide range from
.2Hz to 20kHz.</li>
<li>6 ADSR envelope generators with voltage controlled parameters.</li>
<li>4 delay units up to 10 seconds each.</li>
<li>2 combination filters offering low pass, high pass, band pass
and notch filtering modes.</li>
<li>4 Moog style low pass filters offering a rich analog sound.</li>
<li>MIDI input with velocity and aftertouch provides sensitivity
for more expressive sounds.</li>
<li>Monophonic and polyphonic modes with 128 voices.
<li>Many many presets with more being added regularly.</li>
</ul>
</p>
<hr>
<h2>Samples</h2>
<audio controls>
<source src="/assets/trytryagain.mp3"
type="audio/mp3">
</audio>
<audio controls>
<source src="/assets/trytryagain6.mp3" type="audio/mp3">
</audio>
<div style="clear: both;"></div>
</sectionframe>
+27
View File
@@ -0,0 +1,27 @@
<sectionframe title="Virtual Studio Technology">
<h1>Virtual Studio Technology</h1>
<p>VST (Virtual Studio Technology) is an industry-standard plugin format
that lets a software instrument or effect run directly inside a digital
audio workstation (DAW) - Ableton Live, Cubase, Reaper, FL Studio, and
most others all support it. A VST instrument behaves like a piece of
outboard synthesizer hardware, but lives entirely in software: you play
it from a MIDI keyboard or a piano-roll in your DAW, and it renders
audio in real time alongside every other track in your session.</p>
<p>We build VST instruments in-house, focused on real synthesis
architectures rather than sample playback - the kind of thing you'd
patch together on a real modular rack, but without the cabling.</p>
<h2>Available Instruments</h2>
<ul>
<li><linkbutton page="vst" subpage="modular1">MODULAR1</linkbutton> - a
precision modular synthesizer with fully automatic patching and
polyphony in one VST instrument. 12 module types (6 oscillators, 6
envelope generators, delays, and both Korg- and Moog-style filters)
give it the structural depth of a real modular rack in a single
plugin.</li>
</ul>
<p>More instruments are in development and will appear here as they're
released.</p>
</sectionframe>
+12
View File
@@ -0,0 +1,12 @@
<sectionframe title="VST INSTRUMENTS">
<if value1="$[SUBPAGE]" value2="" type="eq">
<linkbutton page="vst" class="submenuitem-active">OVERVIEW</linkbutton><br>
<else>
<linkbutton page="vst">OVERVIEW</linkbutton><br>
</if>
<if value1="$[SUBPAGE]" value2="modular1" type="eq">
<linkbutton page="vst" subpage="modular1" class="submenuitem-active">MODULAR1</linkbutton><br>
<else>
<linkbutton page="vst" subpage="modular1">MODULAR1</linkbutton><br>
</if>
</sectionframe>
+10 -46
View File
@@ -1,52 +1,16 @@
<page> <page>
<title>VST INSTRUMENTS</title> <title>VST INSTRUMENTS</title>
<contents> <contents>
<retain name="sku"> <div id="vst-subpage">
<sectionframe title="Virtual Studio Technology"> <if value1="$[SUBPAGE]" value2="" type="eq">
<sql>select * from products where sku='MODULAR1'</sql> <include file="vst-overview.subpage">
<div style="display: cell-column;"> <else>
<h2>$[description]</h2> <try>
<div style="display: cell-column; margin-right: 10px;"><img style="width: 800px;" src="/assets/modular1_0.png"></div> <include file="vst-$[SUBPAGE].subpage">
<p>$[text]</p></div> <catch>
<div> <p>That VST instrument doesn't exist.</p>
<span><font size="+3">$19.<su>95</su></font></span> </try>
</if>
</div> </div>
<div>
<addtocart sku="$[.sku]">
</div>
<p>
Precision modular synthesizer with fully automatic patching and
polyphony in one VST instrument. 12 module types provide a rich
synthesis structural capability providing FM, additive and subtractive
methods of creating musical instrumentation using traditional modular
synthsis methods. 2 filter types provide both a Korg sound as well as
the old popular Moog Filter sound.
<ul>
<li>6 full spectrum voltage controlled oscillators with sine,
triangle, saw, pulse with modulation, pink noise, white noise. Sync
and phase modulation for DX7 style FM synthesis. Wide range from
.2Hz to 20kHz.</li>
<li>6 ADSR envelope generators with voltage controlled parameters.</li>
<li>4 delay units up to 10 seconds each.</li>
<li>2 combination filters offering low pass, high pass, band pass
and notch filtering modes.</li>
<li>4 Moog style low pass filters offering a rich analog sound.</li>
<li>MIDI input with velocity and aftertouch provides sensitivity
for more expressive sounds.</li>
<li>Monophonic and polyphonic modes with 128 voices.
<li>Many many presets with more being added regularly.</li>
</ul>
</p>
<hr>
<h2>Samples</h2>
<audio controls>
<source src="/assets/trytryagain.mp3"
type="audio/mp3">
</audio>
<audio controls>
<source src="/assets/trytryagain6.mp3" type="audio/mp3">
</audio>
<div style="clear: both;"></div>
</sectionframe>
</contents> </contents>
</page> </page>