<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>codehop &#187; pattern</title>
	<atom:link href="https://codehop.com/tag/pattern/feed/" rel="self" type="application/rss+xml" />
	<link>https://codehop.com</link>
	<description>#code #art #music</description>
	<lastBuildDate>Mon, 23 Apr 2012 18:37:35 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Custom Sequence List Generators</title>
		<link>https://codehop.com/custom-sequence-list-generators/</link>
		<comments>https://codehop.com/custom-sequence-list-generators/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 16:50:27 +0000</pubDate>
		<dc:creator><![CDATA[Jacob Joaquin]]></dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[docstring]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[interpreter]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[scheduler]]></category>

		<guid isPermaLink="false">http://slipmat.noisepages.com/?p=142</guid>
		<description><![CDATA[Python&#8217;s built-in range() list generator is full of possibilities when used in conjunction with Slipmat&#8217;s @ scheduler. And that&#8217;s just one generator out of, dare I say, a million possibilities. Imagine being able to conveniently import generators from a massive &#8230; <a href="https://codehop.com/custom-sequence-list-generators/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Python&#8217;s built-in <a href="http://slipmat.noisepages.com/2010/04/auto-generating-lists/">range() list generator</a> is full of possibilities when used in conjunction with Slipmat&#8217;s <a href="http://slipmat.noisepages.com/2010/03/coding-in-time-with-the-scheduler/">@ scheduler</a>. And that&#8217;s just one generator out of, dare I say, a million possibilities.</p>
<p>Imagine being able to conveniently import generators from a massive user library of modules. This will be a reality for Slipmat for two reasons:</p>
<ul style="padding-bottom: 16px">
<li>Users can easily write their own generators</li>
<li>Users can easily <a href="http://slipmat.noisepages.com/2010/03/importing-modules-and-reusing-code/">share, import and remix</a> generators</li>
</ul>
<p>I built a list generator called range_plus(), which takes Python&#8217;s range() function a few steps farther. range() is limited to integers; range_plus() removes this restriction and allows for floats. range() supports a single increment step value; range_plus() additionally allows users to pass a list of increment step values that are chosen at random.</p>
<p>Here&#8217;s the working Python defintion for range_plus():</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
def range_plus(start, stop, random_steps=1):
    '''
    Returns a list of successive incremented values
    chosen randomly from a list.

    Input:
    start -- Starting value
    stop --  End point
    random_steps -- A list of incremental values chosen at random or a
        single numeric value
        
    Output:
    return -- A numeric list
    '''
    
    if stop < start:  # Avoid infinite loop from bad input
        return []

    if not isinstance(random_steps, list):
        random_steps = [random_steps]

    L = []

    while start < stop:
        L.append(start)
        start = start + random.choice(random_steps)

    return L
</pre>
<p>I made sure to write the <a href="http://slipmat.noisepages.com/2010/03/on-the-importance-of-docstrings/">docstrings</a>, to make life easier for anyone who may import my code later. Here's a Python interpreter session to test out some numbers:</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
>>> from MyListGenerators import range_plus
>>> range_plus(0, 4, 0.5)
[0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5]
>>> range_plus(0, 4, [0.25, 0.25, 0.5, 0.75])
[0, 0.5, 1.0, 1.5, 1.75, 2.5, 3.0, 3.25, 3.75]
</pre>
<p>As applied to music, range_plus() would be a perfect fit for randomly generating rhythmic patterns, for things such as hi-hats.</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
@0  @range_plus(0, 4, [0.25, 0.25, 0.5, 0.75]) hat()
@4  @range_plus(0, 4, [0.25, 0.25, 0.5, 0.75]) hat()
@12 @range_plus(0, 4, [0.25, 0.25, 0.5, 0.75]) hat()
@16 @range_plus(0, 4, [0.25, 0.25, 0.5, 0.75]) hat()
</pre>
<p>Here's is one scenario for what those patterns would look like in trigger notation:</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
Bar 1:  x.x. x.xx ..x. xx.x
Bar 2:  xx.. x..x ..x. .xx.
Bar 3:  x..x ..x. xx.x .x..
Bar 4:  x.x. .xxx .xxx x..x
</pre>
<p>The 'x' is a 16th note trigger, the '.' is a 16th note rest, and spaces are used to distinguish between each quarter note.</p>
]]></content:encoded>
			<wfw:commentRss>https://codehop.com/custom-sequence-list-generators/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lists as Micro-Sequencers</title>
		<link>https://codehop.com/lists-as-micro-sequencers/</link>
		<comments>https://codehop.com/lists-as-micro-sequencers/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 19:32:38 +0000</pubDate>
		<dc:creator><![CDATA[Jacob Joaquin]]></dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[scheduler]]></category>
		<category><![CDATA[sequencer]]></category>

		<guid isPermaLink="false">http://slipmat.noisepages.com/?p=129</guid>
		<description><![CDATA[On Friday, I listed nine ways in which python methodologies could be used with the @ scheduler. How would they work in a real-world musical context? Today, I&#8217;m showcasing the List as a super convenient micro-sequencer. When the @ scheduler &#8230; <a href="https://codehop.com/lists-as-micro-sequencers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>On Friday, I listed <a href="http://slipmat.noisepages.com/2010/04/nine-rules-for-scheduling-events/">nine ways</a> in which python methodologies could be used with the <a href="http://slipmat.noisepages.com/2010/03/coding-in-time-with-the-scheduler/">@ scheduler</a>. How would they work in a real-world musical context? Today, I&#8217;m showcasing the List as a super convenient micro-sequencer.</p>
<p>When the @ scheduler is given a list of numbers, every value in the list is used to schedule an event; This saves keystrokes and increases legibility. Let&#8217;s see this applied to a simple four-beat rock groove with 8th note hats:</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
@[0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5] hat()
@[1, 3]                           snare()
@[0, 2]                           kick()
</pre>
<p>That plays hat() eight times, and snare() and kick() twice each. This beats having to type out 12 events.</p>
<p>Alternatively, an identifier can point to a predefined list, thus, a sequence can be reused multiple times. The following stores a complex hi-hat pattern in identifier p, and then plays it four times:</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
p = [0, 0.5, 1, 1.5, 2, 2.25, 2.5, 2.75, 3, 3.75]

@0  @p hat()
@4  @p hat()
@8  @p hat()
@12 @p hat()
</pre>
<p>Here&#8217;s the shorthand equivalent:</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
p = [0, 0.5, 1, 1.5, 2, 2.25, 2.5, 2.75, 3, 3.75]

@[0, 4, 8, 12] @p hat()
</pre>
<p>That&#8217;s 40 events in two lines of code, with improved legibility. If this was presented as 40 individual events, it would not be obvious that the same hat pattern is repeated four times.</p>
<p><strong>Banks of Patterns</strong></p>
<p>A list can be utilized as a bank of patterns, a list of lists. In the following example, an empty bank is created, filled with three patterns, and then used in a four measure sequence.</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
b = []
b.append([0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5])               # x.x. x.x. x.x. x.x.
b.append([0, 0.5, 1, 1.5, 2, 2.25, 2.5, 2.75, 3, 3.75])  # x.x. x.x. xxxx x..x
b.append([0, 0.5, 1, 1.5, 2, 2.5, 2.75, 3, 3.5, 3.75])   # x.x. x.x. x.xx x.xx

@0  @b[0] hat()
@4  @b[1] hat()
@8  @b[0] hat()
@12 @b[2] hat()
</pre>
<p><strong>Bonus Round &#8212; Eight Ways to Notate 8th Note Hats</strong></p>
<p>Some good, some bad, some ugly. All produce the same result.</p>
<pre style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 1.2em; padding-bottom: 16px">
1. @map(lambda x: x / 2.0, range(0, 8)) hat()
2. @[0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5] hat()
3. @[i / 2.0 for i in range(0, 8)] hat()
4. @[i / 2.0 for i in range(8)] hat()
5. @[0, 2] @[0, 1] @[0, 0.5] hat()
6. @[0, 1, 2, 3] @[0, 0.5] hat()
7. @range(0, 4) @[0, 0.5] hat()
8. @range(4) @[0, 0.5] hat()
</pre>
<p>Examples 2, 6 and 8 are my personal favorites.</p>
]]></content:encoded>
			<wfw:commentRss>https://codehop.com/lists-as-micro-sequencers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
