<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[The 1-Bit Forum — new engine: StringKS]]></title>
	<link rel="self" href="https://randomflux.info/1bit/extern.php?action=feed&amp;tid=204&amp;type=atom" />
	<updated>2018-12-26T22:33:48Z</updated>
	<generator>PunBB</generator>
	<id>http://randomflux.info/1bit/viewtopic.php?id=204</id>
		<entry>
			<title type="html"><![CDATA[Re: new engine: StringKS]]></title>
			<link rel="alternate" href="http://randomflux.info/1bit/viewtopic.php?pid=1925#p1925" />
			<content type="html"><![CDATA[<p>Thanks you guys! After playing with this engine some more I think it needs more polish, but I&#039;m still glad it works at all. And yes, it&#039;s surprisingly cheap even with realtime low pass, but of course banked buffers open up even more possibilities, like emulating attack transient variations (StringKS can do it but there are no built-in buffers for it so they currently need to be prepared by the user). I&#039;m also wondering if this could be a candidate for Jan Deak style &quot;ahead-of-time&quot; buffer generation. In general I have a strong feeling that his method might be useful for something other than just generating loads of pulse trains, but still searching...</p>]]></content>
			<author>
				<name><![CDATA[utz]]></name>
				<uri>http://randomflux.info/1bit/profile.php?id=2</uri>
			</author>
			<updated>2018-12-26T22:33:48Z</updated>
			<id>http://randomflux.info/1bit/viewtopic.php?pid=1925#p1925</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: new engine: StringKS]]></title>
			<link rel="alternate" href="http://randomflux.info/1bit/viewtopic.php?pid=1919#p1919" />
			<content type="html"><![CDATA[<p>finally!</p><p>this concept is actually pretty cheap (you can &quot;emulate&quot; low pass over the buffer just with shifting the window over longer sample content or by switching more buffers in a banked manner).</p><p>sounds fucking great, congratulations, utz! 1 bit is enough!</p><p>Z.</p>]]></content>
			<author>
				<name><![CDATA[Zilog]]></name>
				<uri>http://randomflux.info/1bit/profile.php?id=35</uri>
			</author>
			<updated>2018-12-17T10:44:27Z</updated>
			<id>http://randomflux.info/1bit/viewtopic.php?pid=1919#p1919</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: new engine: StringKS]]></title>
			<link rel="alternate" href="http://randomflux.info/1bit/viewtopic.php?pid=1915#p1915" />
			<content type="html"><![CDATA[<p>I&#039;m currently listening the demo, it&#039;s impressive as usual! I love this...</p>]]></content>
			<author>
				<name><![CDATA[garvalf]]></name>
				<uri>http://randomflux.info/1bit/profile.php?id=6</uri>
			</author>
			<updated>2018-11-25T20:56:40Z</updated>
			<id>http://randomflux.info/1bit/viewtopic.php?pid=1915#p1915</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[new engine: StringKS]]></title>
			<link rel="alternate" href="http://randomflux.info/1bit/viewtopic.php?pid=1914#p1914" />
			<content type="html"><![CDATA[<p>Wow, appearantly it&#039;s been almost a year since I published a new beeper engine. So it was about time for some good ol&#039; t-state squeezing.</p><p><strong>StringKS</strong> is an experimental engine that implements Karplus-Strong inspired string synthesis. It&#039;s more a proof-of-concept than an actually useful engine (hence no converter is provided), however it does prove that physical modelling is possible in 1-bit, and I think it&#039;s worth exploring this concept further.</p><p>Synthesis is done by creating an initial ring buffer from various sources (at the moment, ROM noise, rectangle wave with variable duty, and saw wave are supported), and then continually running a simple low-pass filter over the buffer. The size of the buffer determines the pitch. It is also possible to source from user-created data (so theoretically one can start from a pre-filtered buffer to create softer attack transients). Additionally, I threw in PWM sample playback on one of the channels, and regular rectangle wave playback (also on one channel only). There&#039;s also a (rather brutal) overdrive mode. All synth methods except the saw wave one support a somewhat crude 3-bit volume control.</p><p><a href="https://github.com/utz82/ZX-Spectrum-1-Bit-Routines/tree/master/stringks">source code</a><br />An extremely uninspired demo tune is attached.</p><p>Limitations:<br />- 8-bit frequency counters only, so the available note range is rather limited.<br />- At higher notes, tones will fade out very quickly.</p><p>I believe it&#039;s possible to rectify these issues, but more research is needed. One possible approach I experimented with was to generate data on the fly with the usual add-and-compare method while keeping track of the low-pass cutoff. It works but so far sound quality is worse than with the buffered approach. Another way might be to pre-scale the speed of buffer iteration to reach lower frequencies (e.g. update buffer pointer only every other sound loop iteration), and to slow down decay by only running the filter on every other buffer iteration. Still need to find some free t-states for that, though. Perhaps splitting updates so only one channel gets updated per sound loop iteration might be doable. Well, I&#039;m open to ideas, of course <img src="http://randomflux.info/1bit/img/smilies/wink.png" width="15" height="15" alt="wink" /></p>]]></content>
			<author>
				<name><![CDATA[utz]]></name>
				<uri>http://randomflux.info/1bit/profile.php?id=2</uri>
			</author>
			<updated>2018-11-15T23:09:45Z</updated>
			<id>http://randomflux.info/1bit/viewtopic.php?pid=1914#p1914</id>
		</entry>
</feed>
