bikibird [Lexaloffle Blog Feed]https://www.lexaloffle.com/bbs/?uid=49583 PICO DAW <p> <table><tr><td> <a href="/bbs/?pid=163065#p"> <img src="/bbs/thumbs/pico8_daw-11.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=163065#p"> PICO DAW</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=163065#p"> [Click to Play]</a> </td></tr></table> <br /> PICO DAW is a digital audio workstation for creating PICO-8 tunes. If you've ever been frustrated by the piano style layout keyboard layout of the music editor or just wished you could draw your music, PICO DAW is for you. It's a mouse-based alternative for tune creation.</p> <h1>Quick Start Guide</h1> <ul> <li>Open the PICO-8 console and enter load #daw.</li> <li>Save the cart under a new name.</li> <li>Optional: Add any desired custom instruments in SFX slots 0 through 7.</li> <li>Run the cart.</li> <li>Hold down the left mouse button and drag to draw a note.</li> <li>Select the active track by scrolling the mouse wheel.</li> <li>Pan through music patterns with left and right arrows.</li> <li>Edit notes by right clicking on them.</li> </ul> <p>There are many more keyboard shortcuts and tools. Keep reading to get the most out of PICO DAW.</p> <h1>Preliminaries</h1> <p>While you can use the version of PICO DAW embedded in this page, it is better to run the cartridge directly from PICO-8. Open the PICO-8 console and enter &lt;kbd&gt;LOAD #DAW&lt;/kbd&gt;. Then save the cart under a new name so that you have a dedicated cart in which to store your tunes. Optionally, add any desired custom instruments in SFX slots 0 through 7.</p> <p>PICO DAW assumes that you will use all 4 channels, 56 SFXs (8 through 64), and music patterns 0 through 13. If this does not reflect your wishes, go into the PICO-8 music editor and configure the music patterns to suit your project.</p> <p>Once PICO DAW is configured according to your needs, run the cart to begin composing.</p> <h1>Saving</h1> <p>PICO DAW automatically saves your work every 5 minutes. You can force a save anytime by pressing Ctrl-S. Be sure to press Ctrl-S before exiting PICO DAW. If you forget to press Ctrl-S before exiting, enter &lt;kbd&gt;RESUME&lt;/kbd&gt; in the console, press Ctrl-S, and then exit again.</p> <h1>Navigating</h1> <p>Composing is done one music pattern at a time. The music pattern occupies the major portion of the screen with a few notes of the previous and next music patterns displayed at the left and right margins. The current pattern number displays in the upper left of the screen at the top of the toolbar. </p> <p>Each data-entry tub is 3 pixels wide. The tubs are arrange horizontally across the screen in sequence from tub 0 to 31, left to right. This is the time axis. The pitch axis is vertical. The potential pitch values are arranged sequentially from highest at the top to lowest at the bottom. The horizontal lines are &lt;dfn&gt;staff lines&lt;/dfn&gt; corresponding to the currently selected scale and indicate potential pitch values that fit the chosen scale. </p> <p>Change the active music pattern with the ⬅️ and ➡️ arrow keys or by left clicking in the left and right margins. Press Home or End to jump to the beginning or end of the tune.</p> <h1>Undoing and Redoing</h1> <p>Ctrl-Z and Ctrl-Y undo and redo editing actions. The size of the undo buffer is limited by PICO-8's memory. Cut and insert actions are especially memory intensive operations and decrease the number of actions that can be held in the undo buffer. </p> <h1>Drawing Notes</h1> <p>Compose by drawing notes. Notes are drawn one channel at a time. The cross-hair color reflects the current channel. Channel 0 is orange; channel 1, yellow; channel 2, green; and channel 3, blue. To change the active channel, scroll the mouse wheel while hovering over the pattern.</p> <p>Notes may be placed on staff lines for scale notes or between staff lines for non-scale notes. To place a note, move the cross-hair anywhere within the current music pattern. Press the left mouse button to lock in a pitch. Then drag from left to right to elongate the note and finally release the mouse button to finish placing a note in the currently active channel.</p> <h1>Erasing Notes</h1> <p>Hover the cursor over the note to be erased. Hold down the ctrl key, click and drag across the note to erase it. Only notes in the current channel are erased. (See also the delete tool below.</p> <h1>Selecting</h1> <p>Some actions require selecting a group of data-entry tubs from the pattern. Hold down the shift key while dragging with the left mouse button to draw a rectangle over the selected notes. Release the mouse button and Shift key to finalize the selection. To cancel a selection, right-click outside of it.</p> <h1>Transposing</h1> <p>Select a group of notes and use the ⬆️ and ⬇️ keys to transpose the notes up and down the scale. Hold down the Ctrl key while transposing to transpose without regard to the scale. Move the mouse to cancel transposition mode.</p> <h1>Setting Note Options</h1> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/54_note_menu.png" alt="" /> <p>To view or change the instrument, volume, and/or effect options for an individual note, right-click on a note to open the note options menu. To edit the options for a group of notes, first select them and then right-click on a note in the selection to serve as the model note. Changes will only be applied to notes that are in the same channel as the model note and only the actual changes to the model note are applied to the selected notes. Any unchanged options from the model note are ignored.</p> <p>Hover over the first icon and use the mouse wheel to change the note's instrument. The standard instruments are represented with the same waveform icons found in the SFX editor. Custom instruments are represented by the numbers 0 through 7.</p> <p>The next icon is the effect icon. Use the mouse wheel to change the effect.</p> <p>The third icon is the volume icon. Use the mouse wheel to set the volume. A note's volume cannot be set to zero with the note options menu; erase or delete the note instead.</p> <p>Click on the last icon, the speaker, to listen to the selected note(s) in the current channel. (See also playback.)</p> <p>To close the note option menu, cancel the selection by right-clicking outside of the selection.</p> <p>To see the current options for a note without opening the note menu, hover over the note with the cursor.</p> <h1>Toolbar</h1> <p>Right-click in the left margin to toggle the toolbar on or off.</p> <h2>Channel Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/channel2.png" alt="" /> <p>Each channel cursor has default attack, sustain, and release options for instrument, volume, and effect. When drawing a note, the attack settings are applied to the first tub of note, release settings to the last tub, and sustain settings to any tubs in between. To change the default note options for the current channel cursor, select a contiguous group of tubs from the current channel to use as a model. Then, click the channel tool to assign attack, sustain, and release settings to the channel based on the selected notes. The instrument, volume, and effect settings from the first tub in the selection is used for the attack, the last tub settings for the release, and the second tub settings for the sustain. To set all four channels to the same set of defaults, hold down the shift key while clicking on the channel tool.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/channels.png" alt="" /> <p>Clicking the channel tool without a selected group of notes, reveals the SFX options menu for the current channel and music pattern. Hover over the menu items to reveal the settings and scroll the mouse wheel to change them. Setting changes are applied immediately to the current channel displayed by the channel icon.</p> <p>The <em>noiz</em> and <em>buzz</em> filter icons are on/off switches. A switch is off when it is slid to the left and on when slid to the right. The <em>detune</em>, <em>reverb</em>, <em>dampen</em> filter icons are three way switches. The left position indicates no effect, the right position indicates moderate effect, and a completely filled switch indicates maximum effect.</p> <p>The metronome icon indicates the SFX <em>spd</em> setting and the brackets icon indicates the SFX <em>len</em> setting.</p> <p>To change settings for all the SFXs associated with the current pattern (instead of just the SFX associated with the current channel,) hold down the shift key while adjusting a setting.</p> <p>To apply the current channel's SFX settings to the same channel's SFXs in all the patterns from the current pattern through the end of the tune, click the end icon in the settings menu. You will hear a confirmation &quot;bloop&quot; to let you know the settings have been applied. To apply all the channels' SFX setting to all the patterns from the current pattern through the end of the tune, hold down the shift key while clicking the end icon. </p> <h2>Copy Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/57_copy.png" alt="" /> <p>Select a group of notes and click the copy icon to copy the notes for stamping. The cursor automatically changes to the repetition/transposition stamp. Ctrl-C may also be used to copy.</p> <h2>Stamp Tools</h2> <p><img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/stamps.png" alt="" />Click one of the stamp icons to stamp with previously copied notes. The stamps are, from top to bottom: repetition/transposition, inversion, retrograde, and retrograde inversion.</p> <p>Move the mouse to position the stamp pattern. Note intervals automatically adjust to the scale you are currently using. Hold down the Ctrl key while stamping to ignore the current scale and stamp chromatically. Left-click to place notes. If you click near the left or right margin, any notes that do not fit the current music pattern will spill into the previous or next pattern.</p> <p>Optionally, scroll the mouse wheel before stamping to change which channel(s) the notes are assigned to.</p> <p>Right-click anywhere in the music pattern to cancel stamp mode and return to draw mode.</p> <h2>Insert Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/64_insert.png" alt="" /> <p>To insert empty data-entry tubs in the current music pattern, draw a selection rectangle from the desired insertion point to the desired width of the inserted space. Left-click the insert icon to push notes right from the insertion point to the end tune by the width of the selection. Right-click the insert icon to limit inserting to the current channel. </p> <p>For this tool the selection height has no meaning, only the selection width. There must be space in the music patterns for the shifted notes to flow into. Otherwise, notes at the end of the composition will be lost. Also, if some channels are muted downstream of the current music pattern, the notes in some channels may be stopped from shifting while continuing to shift for unmuted channels. Take care that you know the structure of your composition and that you understand how the notes will flow prior to using insert.</p> <p>The Insert key may be used instead of left-clicking the insert icon.</p> <h2>Cut Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/65_cut.png" alt="" /> <p>To cut notes from a music pattern, Select a group of notes and left-click the cut icon. The selected notes are copied and ready for stamping with any of the stamp tools. The notes to the right of the cut section are shifted left to replace the cut section. For this tool, the selection height only applies to the notes copied for stamping and otherwise has no meaning. Right-click the cut tool to limit cutting to the current channel. </p> <p>Ctrl-X may also be used be used left-clicking the cut icon.</p> <h2>Delete Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/72_delete.png" alt="" /> <p>Select a group of notes and click the delete icon to delete them. You may also press the Delete key. (See also erasing notes.)</p> <h2>Scale Dial</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/66_scale.png" alt="" /> <p>By default PICO DAW shows staff lines for the Natural C Major scale. To select a different scale, hover over the scale dial and scroll the mouse wheel. To shift the scale mode, hover over the scale dial and hold down the Shift key while scrolling the mouse wheel. To change the tonic, hover over the scale dial and hold down the Ctrl key while scrolling the mouse wheel. </p> <p>To create a custom scale, draw a group of ascending notes with the current channel cursor to represent the custom scale and select them. Then left-click the scale dial icon. The new scale is added to the scale dial tool and the staff lines are updated to reflect the new scale.</p> <h2>Chord Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/67_chord.png" alt="" /> <p>Hover over the chord icon and scroll the mouse wheel to change the chord number. The root of the chord is displayed as a dotted line. (When the chord number is set to I, the root of the chord and the tonic are the same. So, the chord icon may also be used to highlight the tonic.)</p> <p>Press the 3, 5, and/or 7 keys to toggle on display of the 3rd, 5th, and/or 7th intervals. Press the keys again to toggle them off.</p> <p>Press shift-3 repeatedly to rotate between display the major, minor, or scale third interval.</p> <p>Press shift-5 repeatedly to rotate between display the diminished, perfect, augmented or scale fifth interval.</p> <p>Press shift-7 repeatedly to display the major, minor, or scale seventh interval.</p> <p>Click the chord icon to toggle interval highlighting on and off as a group.</p> <h2>Measure Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/68_measure.png" alt="" /> <p>Click the measure icon (whole note symbol) to toggle measure markers on and off. By default there are 4 measures of eight notes per music pattern.</p> <p>To change the measure width, select a group of data-entry tubs equal to the width of the new measure and click the measure icon. It's usually best to do this on the first music pattern of the tune and select tub zero through the desired width.</p> <h2>Subdivision Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/69_subdivision.png" alt="" /> <p>Click the subdivision icon (quarter note symbol) to display subdivision markers when the measure markers are displayed. Click the icon again to toggle off the subdivision markers.</p> <p>To change the subdivision width, select a group of data-entry tubs equal to the width of the new subdivision and click the subdivision icon. </p> <p>The measure will be divided as evenly as possible with any remainder appearing as the width of the last subdivision. You may adjust the width of individual subdivisions by holding down the Alt key. (This is helpful for odd meters and swing rhythms.) The cursor will change to the divider icon. Move the mouse over a subdivider (lavender dots), and drag with the left mouse button to resize the subdivision. Individual subdivisions cannot be deleted. Instead, change the number of subdivisions by changing the width.</p> <h2>Play Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/70_play.png" alt="" /> <p>To listen to your composition, left-click the play icon. To record, right-click the play button. The composition will play from the current music pattern to the last music pattern for the tune. If recording, a wave file will be created on the computer's desktop.</p> <p>Select a group of notes prior to clicking the play icon to limit playback to the selection. </p> <p>The Spacebar may also be used instead of the playback icon.</p> <h2>Stop Tool</h2> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/stop.png" alt="" /> <p>To stop playback, click the stop icon or press Spacebar.</p> https://www.lexaloffle.com/bbs/?tid=147610 https://www.lexaloffle.com/bbs/?tid=147610 Sat, 01 Mar 2025 16:37:03 UTC Snowblowers <p> <table><tr><td> <a href="/bbs/?pid=159061#p"> <img src="/bbs/thumbs/pico8_snowblowers-3.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=159061#p"> snowblowers</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=159061#p"> [Click to Play]</a> </td></tr></table> </p> <p>Old Man Winter and Santa Claus have been feuding all year. It started with yard signs and then things escalated. Now OMW is blowing up a big storm on Christmas Eve!</p> <p>You, Jack Frost, must blow away the snow so that Santa can get out and make his deliveries. </p> <h1>Controls</h1> <p>Controls are simple. Just use 🅾️ (Z key on computer keyboard) to blow a puff air. This propels jack backward and changes the air currents to redirect the snow, hopefully away from Santa's house. </p> <h1>Credits</h1> <p>Art, SFX, music and coding by <a href="https://www.lexaloffle.com/bbs/?uid=49583"> @bikibird</a><br /> with easing functions borrowed from <a href="https://www.lexaloffle.com/bbs/?tid=40577"><a href="https://www.lexaloffle.com/bbs/?tid=40577">https://www.lexaloffle.com/bbs/?tid=40577</a></a><br /> and tline rotation borrowed from <a href="https://www.lexaloffle.com/bbs/?tid=38548"><a href="https://www.lexaloffle.com/bbs/?tid=38548">https://www.lexaloffle.com/bbs/?tid=38548</a></a>.</p> <p>Special thanks to <a href="https://www.lexaloffle.com/bbs/?uid=105531"> @NarcolepticFrog</a>, <a href="https://www.lexaloffle.com/bbs/?uid=37923"> @dredds</a>, <a href="https://www.lexaloffle.com/bbs/?uid=68442"> @ericb</a>, and <a href="https://www.lexaloffle.com/bbs/?uid=25532"> @freds72</a> for playtesting and advice. </p> <p>This cart is part of the <a href="https://www.lexaloffle.com/bbs/?tid=145806">2024 Advent Calendar</a>. Be sure to check out all the great games in this year's calendar.</p> https://www.lexaloffle.com/bbs/?tid=146029 https://www.lexaloffle.com/bbs/?tid=146029 Wed, 11 Dec 2024 12:33:47 UTC Recruiting Elves for 2024 Advent Calendar <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/calendar_cover_9.png" alt="" /> <p>Good news! After intensive labor negotiations, Santa's elves have decided not to go on strike. In an effort to meet the elves' demands for less stress and more fun, management has agreed to start the PICO-8 Advent Calendar Bundle a few weeks earlier than normal and manage the project with a game jam on Itch. We're hoping to get far more participants than last year and streamline the onboarding process. Please don your elf cap and join us. <a href="https://itch.io/jam/pico-8-advent-calendar-2024">https://itch.io/jam/pico-8-advent-calendar-2024</a></p> https://www.lexaloffle.com/bbs/?tid=144571 https://www.lexaloffle.com/bbs/?tid=144571 Thu, 03 Oct 2024 17:30:41 UTC Album Cart for Free Music Jam <p> <table><tr><td> <a href="/bbs/?pid=140958#p"> <img src="/bbs/thumbs/pico8_album-6.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=140958#p"> Album Cart for PICO-8 Free Music Jam</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=140958#p"> [Click to Play]</a> </td></tr></table> </p> <p><em>Album</em> is a collection of music visualizers for the <a href="https://itch.io/jam/pico-8-free-music-jam">PICO-8 Free Music Jam</a>. Just add your music, cover art, and a little bit of meta-data to make your own album.</p> <h1>Controls</h1> <p>Press ⬆️ to dismiss the credit for the tune.<br /> Press ⬇️ to see the credit.<br /> Press ⬅️ to listen to the previous tune.<br /> Press ➡️ to listen to the next tune.<br /> Press ❎ or 🅾️ to replay a tune.</p> <h1>Suggested workflow</h1> <ul> <li>From the PICO-8 console <code>load #album</code>.</li> <li>Save the album under a new name to make it yours.</li> <li>Create your music in the cart or manually copy the SFXes and music pattern from another cart.</li> <li>Replace the cover art and label.<br /> <code>import my_image.png</code> for album cover.<br /> <code>import -l my_image.png</code> for cart label.</li> <li>Select the code editor and navigate to tab 2: <code>tunes</code>.<br /> Fill out the data in the tunes table, adding one entry per tune.</li> <li>If you are using custom instruments, navigate to tab 3 to add transposition data </li> <li>Save the cart.</li> <li>Run the cart to see and hear your music!</li> </ul> <h1>Customization</h1> <h2>Cover Art</h2> <p>Be default, your sprite sheet is your cover art. The cart uses <code>map(0,0)</code> to draw the cover art. This area of the map is occupied by the entire sprite sheet. By editing the map you can assemble a different cover based on elements of the sprite sheet if you prefer.</p> <h2>Properties</h2> <p>At a bare minimum, each entry in the tunes table must have the following properties defined: pattern, title, credit and visualizer:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>{ pattern=0, --music pattern number to play title=&quot;title of tune&quot;, -- tune title credit=&quot;me&quot;, visualizer=cover, },</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>The choices for visualizer are <code>bubble</code>, <code>cover</code>, <code>harp</code>, <code>piano_roll</code>, <code>ripples</code>, and <code>stars</code>. (If you are good at coding, you can add some new ones!)</p> <p>Additional properties may be used to customize the look: </p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>{ pattern=0, --music pattern number to play title=&quot;title of tune&quot;, credit=&quot;me&quot;, visualizer=piano_roll, text=12, outline={13,13}, background=-1, -- for map(0,0) or color 0 through 15 palette={[0]=0,130,141,13,12,140,1,131,3,139,11,138,135,10,9,137}, foreground={10,10,10,10}, },</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>Set <code>text</code> to a color number, 0 through 15, to set the color of title and credit text. Defaults to 7. Supported by all visualizers.</p> <p>set <code>outline</code> to a table of two colors, for example <code>outline={6,6}</code> to set the left and right outlines of the text. Defaults to {1,1}. Supported by all visualizers. <code>outline</code> also sets the shadow colors in the <code>bubble</code>, <code>ripples</code>, <code>piano_roll</code> visualizers. To omit the outline, set outline to <code>{-1,-1}</code>.</p> <p>Set <code>background</code> to <code>-1</code> to use the cover art in the background or to a color number to select a solid color. <code>background</code> defaults to black. Supported by all visualizers</p> <p>Set <code>palette</code> to specify a custom palette for all draw operations. Defaults to PICO-8 standard palette. Supported by all visualizers. Harp visualizer expects colors 4 through 15 to form a color gradient. For example: <code>palette={[0]=0,130,141,13,12,140,1,131,3,139,11,138,135,10,9,137}</code> causes consonant note pairs to appear close in color, with more dissonant notes creating more visual contrast.</p> <p>Set <code>foreground</code> to a table of 4 colors representing the 4 audio channels. For example: <code>foreground={8,8,8,8}</code> displays each channel in red. Defaults to light blue for <code>ripples</code> and red for <code>piano_roll</code>. Supported by <code>piano_roll</code> and <code>ripples</code> visualizers only.</p> <p>You can change where the notes appear on the screen using two properties, <code>offset</code> and <code>spacing</code>. The visualizer code converts the pitches to numeric values between 0 and 64. Each successive value is one half-step (semitone) apart. C0 maps to zero and D#5 maps to 64. <code>offset</code> is the number of half-steps to add to the pitch value for display purposes. (It does not affect how the pitch is played.) Use a negative value to shift left and a positive value to shift right. In the case of <code>stars</code> and <code>ripples</code> every multiple of 8 shifts the display up or down by full rows.</p> <p><code>spacing</code> is the factor by which to multiply the pitch value for display purposes. Values greater than 1 will spread the pitch display apart. Values less than 1 will compress them. <code>piano_roll</code> and <code>harp</code> defaults to a spacing of 2. <code>stars</code> and <code>ripples</code> default to 16. Using a value of 8 for <code>stars</code>, will cause the night sky to appear in the top half of the screen only. Using a value of 8 for <code>ripples</code> will cause the puddles to appear in the bottom half of the screen. </p> <p>Clever use of <code>spacing</code> and <code>offset</code> allows for optimal placement of the notes on top of your cover art.</p> <h1>Custom Instruments</h1> <p>If you are using custom instruments that transpose the pitch being played, the pitch display will be incorrect by default. You may correct this by clicking on tab three in the code editor to edit the <code>instruments table</code>. Enter the number of half-steps (negative or positive) to transpose the display pitch value for each custom instrument you are using. </p> <h1>Record Function</h1> <p>A record function is included for your convenience. To record a tune, enter <code>record(pattern, repeats, fadeout)</code> in the PICO-8 console, where <code>pattern</code> is the starting pattern number of your tune, <code>repeats</code> is the number of times to repeat a looping tune, and fadeout is the number of milliseconds to fade out a loop after is done repeating. <code>repeats</code> defaults to 2 and <code>fadeout</code> defaults to 5000. The wave file should appear on your desktop after recording is complete.</p> <h1>Credits</h1> <p>Visualizers by <a href="https://www.lexaloffle.com/bbs/?uid=49583"> @bikibird</a><br /> Label Art by <a href="https://www.lexaloffle.com/bbs/?uid=55005"> @paraK00PA</a><br /> Record function based on code by <a href="https://www.lexaloffle.com/bbs/?uid=40166"> @packbat</a></p> <p>To credit this cart when used in your own work add this statement wherever you list the credits for your project:</p> <p><em>Visualizers provided courtesy of the <a href="https://itch.io/jam/pico-8-free-music-jam">PICO-8 Free Music Jam</a>.</em></p> https://www.lexaloffle.com/bbs/?tid=140061 https://www.lexaloffle.com/bbs/?tid=140061 Thu, 01 Feb 2024 00:28:01 UTC Polar Distress <p> <table><tr><td> <a href="/bbs/?pid=139080#p"> <img src="/bbs/thumbs/pico8_polardistress-1.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=139080#p"> Polar Distress</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=139080#p"> [Click to Play]</a> </td></tr></table> </p> <p>Help Santa pass his audition with the Norse Ursine Merriment Band.</p> <p>Hints: </p> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;">Puzzles have more than one winning solution. So, if you don't like your harmonies, try another way.</div></div></div></p> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;">Polar bears will follow you if you get close to them. This can help or hinder.</div></div></div></p> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;">Candy canes give Santa energy to leap across large distances automatically.</div></div></div></p> <p>Credits:</p> <p>Created for the <a href="https://www.lexaloffle.com/bbs/?tid=55407">PICO-8 Holiday Bundle 2023</a><br /> Label Art by <a href="https://www.lexaloffle.com/bbs/?uid=55005"> @paraK00PA</a><br /> <em>Jingle Bells</em> by James Lord Pierpont<br /> <em>We Wish You a Merry Christmas</em> popularized by Arthur Warrell<br /> Everything else by <a href="https://www.lexaloffle.com/bbs/?uid=49583"> @bikibird</a></p> https://www.lexaloffle.com/bbs/?tid=55451 https://www.lexaloffle.com/bbs/?tid=55451 Sat, 23 Dec 2023 15:15:30 UTC PICO-8 Advent Calendar <p>ZOMG! I just realized it's October already! The PICO-8 advent calendar is just around the corner. Or, maybe not... We're still looking for tons more people to contribute a winter holiday themed PICO-8 project to the calendar. It doesn't have to be an epic masterpiece. Small games and demos are welcome. You can even reskin a game you previously released. </p> <p>If you're interested, make sure you've joined the <a href="https://discordapp.com/invite/EwQ86eq">PICO-8 Discord server</a> and then see <a href="https://discord.com/channels/215267007245975552/220602714982318081/1146905525158682665">https://discord.com/channels/215267007245975552/220602714982318081/1146905525158682665</a> for info on how to contribute, cuz we sure need you.</p> https://www.lexaloffle.com/bbs/?tid=54404 https://www.lexaloffle.com/bbs/?tid=54404 Sun, 01 Oct 2023 15:04:09 UTC Music Theory Tutorial <p>I've released the first thirteen lessons of my music theory tutorial, available here: <a href="https://bikibird.itch.io/music-theory">https://bikibird.itch.io/music-theory</a>. It's designed for people who want to make their own music for PICO-8 games, but feel they don't have the skill or talent to do so. </p> <p>The tutorial provides an introduction to the basics of pitch, melody, harmony, rhythm and composition within the context of PICO-8. It explores music in a decidedly mathy way through a series of interactive demos that use spatial relations to connect sound to vision.</p> <p>Only the parts of music theory that are relevant to PICO-8 are covered. No prior knowledge of music is assumed. There's no reading sheet music or needing to play an instrument.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/musictheory3.png" alt="" /> https://www.lexaloffle.com/bbs/?tid=53972 https://www.lexaloffle.com/bbs/?tid=53972 Sat, 02 Sep 2023 12:10:52 UTC Puffy Coats <p> <table><tr><td> <a href="/bbs/?pid=122632#p"> <img src="/bbs/thumbs/pico8_puffycoats-2.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=122632#p"> Puffy Coats</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=122632#p"> [Click to Play]</a> </td></tr></table> </p> <p>You were so excited to try your brand new skates on Christmas day that you skated out to the middle of the lake without checking the ice conditions. Now you are on thin ice and just want to get back to your friend on the shore.</p> <h3>Game Play</h3> <p>Control your skates with the left and right buttons. Alternate left and right to speed up. Hold to turn. You haven't exactly learned to stop yet, but if you start turning circles, you will eventually slow down. You can walk on the snow, but it is very slow.</p> <h3>Credits:</h3> <p>Music composed by Vince Guaraldi<br /> <em>Christmas Time Is Here</em> arranged by <a href="https://www.lexaloffle.com/bbs/?uid=11292"> @Gruber</a><br /> 3d effects: <a href="https://www.lexaloffle.com/bbs/?uid=39676"> @Mot</a>'s <a href="https://www.lexaloffle.com/bbs/?tid=37982">Instant 3d Plus Library</a><br /> Special thanks to <a href="https://www.lexaloffle.com/bbs/?uid=32135"> @thattomhall</a> for advice on the ending<br /> Everything else by <a href="https://www.lexaloffle.com/bbs/?uid=49583"> @bikibird</a></p> <p>Created for the <a href="https://www.lexaloffle.com/bbs/?tid=50644">2022 Advent Calendar</a></p> https://www.lexaloffle.com/bbs/?tid=50699 https://www.lexaloffle.com/bbs/?tid=50699 Sun, 18 Dec 2022 05:05:51 UTC Santa Scouts <p> <table><tr><td> <a href="/bbs/?pid=122456#p"> <img src="/bbs/thumbs/pico8_santascouts-5.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=122456#p"> Santa Scouts</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=122456#p"> [Click to Play]</a> </td></tr></table> </p> <p>This is the year you find out if Santa is really real. You and your siblings are staying up late to finally get proof. The light are out, but you're not scared!</p> <h3>Game Play</h3> <p>Requires mouse. Hold down left mouse button to turn on flashlight. Drag mouse across screen to catch Santa in the act. Press ❎ to snap a picture.</p> <h3>Credits</h3> <p><em>Up on the Housetop</em> composed by Benjamin Hanby<br /> Midilib flute by <a href="https://www.lexaloffle.com/bbs/?uid=68442"> @ericb</a> <a href="https://www.lexaloffle.com/bbs/?tid=49487">https://www.lexaloffle.com/bbs/?tid=49487</a><br /> Flashlight effect informed by <a href="https://www.lexaloffle.com/bbs/?uid=16423"> @Krystman</a> <a href="https://www.lexaloffle.com/bbs/?tid=46286">https://www.lexaloffle.com/bbs/?tid=46286</a><br /> Fizzle fader borrowed from <a href="https://www.lexaloffle.com/bbs/?uid=15133"> @DrPete</a> <a href="https://www.lexaloffle.com/bbs/?tid=29862">https://www.lexaloffle.com/bbs/?tid=29862</a><br /> Everything else by <a href="https://www.lexaloffle.com/bbs/?uid=49583"> @bikibird</a></p> <p>Created for the <a href="https://www.lexaloffle.com/bbs/?tid=50644">2022 Advent Calendar</a></p> <p>WARNING: SPOILERS IN COMMENTS. SCROLL AT YOUR OWN RISK.<br /> <em><br /> </em><br /> <em><br /> </em><br /> <em><br /> </em><br /> *<br /> WARNING: SPOILERS IN COMMENTS. SERIOUSLY, GO BACK.</p> <p><em><br /> </em><br /> <em><br /> </em><br /> <em><br /> </em><br /> <em><br /> </em><br /> *<br /> WARNING: SPOILERS IN COMMENTS. WELL, YOU CAN'T SAY I DIDN'T WARN YOU.</p> <p><em><br /> </em><br /> <em><br /> </em><br /> <em><br /> </em><br /> <em><br /> </em><br /> WARNING: SPOILERS IN COMMENTS. HERE THEY COME.</p> <p><em><br /> </em><br /> <em><br /> </em><br /> <em><br /> </em><br /> <em><br /> </em><br /> *</p> https://www.lexaloffle.com/bbs/?tid=50669 https://www.lexaloffle.com/bbs/?tid=50669 Thu, 15 Dec 2022 04:53:45 UTC Speako8 Speech Synthesis Library <p> <table><tr><td> <a href="/bbs/?pid=116607#p"> <img src="/bbs/thumbs/pico8_speako8-2.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=116607#p"> Speako8</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=116607#p"> [Click to Play]</a> </td></tr></table> </p> <p>Add speech synthesis to your games with Speako8, a speech synthesis library for PICO-8 in under a thousand tokens! It's loosely based on a Klatt synthesizer and will remind some folks of Software Automatic Mouth (S.A.M.) </p> <p>To add Speako8 to your games, copy and paste the library below:<br /> <div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>--speako8_lib_min by bikibird do d=split(&quot;aa=1320,1,500,4,2,0,1,2600,160,1220,70,700,130,-250,100;ae=1270,1,1000,4,2,0,.79,2430,320,1660,150,620,170,-250,100;ah=770,1,1000,4,2,0,.79,2550,140,1220,50,620,80,-250,100;ao=1320,1,1000,4,2,0,.74,2570,80,990,100,600,90,-250,100;aw=720,1,1000,4,2,0,.79,2550,140,1230,70,640,80,-250,100/720,1,1000,4,3,0,0,2350,80,940,70,420,80,-250,100;ay=690,1,1000,4,2,0,.9,2550,200,1200,70,660,100,-250,100/690,1,1000,4,2,0,.223,2550,200,1880,100,400,70,-250,100;eh=830,1,1000,4,2,0,.44,2520,200,1720,100,480,70,-250,100;er=990,1,1000,4,2,0,.41,1540,110,1270,60,470,100,-250,100;ey=520,1,500,4,2,0,.44,2520,200,1720,100,480,70,-250,100/520,1,500,4,2,0,.05,2600,200,2020,100,330,50,-250,100;ih=720,1,1000,4,2,0,.23,2570,140,1800,100,400,50,-250,100;iy=880,1,1000,4,2,0,0,2960,400,2020,100,310,70,-250,100;ow=1210,1,1000,4,2,0,.59,2300,70,1100,70,540,80,-250,100;oy=513,1,1000,4,2,0,.62,2400,130,960,50,550,60,-250,100/513,1,1000,4,2,0,.13,2400,130,1820,50,360,80,-250,100/513,1,1000,4,2,0,.13,2400,130,1820,50,360,80,-250,100;uh=880,1,1000,4,2,0,.36,2350,80,1100,100,450,80,-250,100;uw=390,1,1000,4,2,0,.1,2200,140,1250,110,350,70,-250,100/390,1,1000,0,1,0,-.12,2200,140,900,110,320,70,-250,100/390,1,1000,0,0,0,-.12,2200,140,900,110,320,70,-250,100;l=440,1,1000,0,2,0,0,2880,280,1050,100,310,50,-250,100;r=440,1,1000,0,2,0,0,1380,120,1060,100,310,70,-250,100;m=390,1,1000,0,0,0,0,2150,200,1100,150,400,300,-450,100;n=360,1,1000,0,0,0,0,2600,170,1600,100,200,60,-450,100;ng=440,1,1000,0,0,0,0,2850,280,1990,150,200,60,-450,100;ch=230,0,20,0,0,1,0,2820,300,1800,90,350,200,-250,100/100,0,100,1,0,1,0,2820,300,1800,90,350,200,-250,100;sh=690,0,20,0,0,1,0,2750,300,1840,100,300,200,-250,100;zh=1,1,250,0,0,.5,0,2750,300,1840,100,300,200,-250,100/385,1,400,1,0,.5,0,2750,300,1840,100,300,200,-250,100;jh=330,1,500,1,0,1,0,2820,270,1800,80,260,60,-250,100;dh=275,1,250,0,0,.5,0,2540,170,1290,80,270,60,-250,100;f=1,0,15,0,0,1,0,2080,150,1100,120,340,200,-250,100/660,0,25,1,0,1,0,2080,150,1100,120,340,200,-250,100;s=690,0,10,0,0,1,0,2530,200,1390,80,320,200,-250,100;k=88,0,100,0,0,1,0,2850,330,1900,160,300,250,-250,100/220,2,5,1,0,1,0,2850,330,1900,160,300,250,-250,100;p=44,0,50,0,0,1,0,2150,220,1100,150,400,300,-250,100/220,2,2,1,0,1,0,2150,220,1100,150,400,300,-250,100;t=66,0,100,0,0,2,0,2600,250,1600,120,400,300,-250,100/220,2,5,0,0,1,0,2600,250,1600,120,400,300,-250,100;g=88,0,100,0,0,1,0,2850,280,1990,150,200,60,-250,100;b=44,0,100,0,1,0,0,2150,220,1100,150,400,300,-250,100;d=66,0,100,0,0,1,0,2600,170,1600,100,200,60,-250,100;th=606,0,10,0,0,1,0,2540,200,1290,90,320,200,-250,100;v=330,1,1000,0,0,.5,0,2080,120,1100,90,220,60,-250,100;z=410,1,1000,0,0,.5,0,2530,180,1390,60,240,70,-250,100;w=440,1,1000,0,0,0,.1,2150,60,610,80,290,50,-250,100;y=440,1,1000,0,0,0,0,3020,500,2070,250,260,40,-250,100;&quot;,&quot;;&quot;)x={}for a in all(d)do local e=split(a,&quot;=&quot;)local d,a=e[1],split(e[2],&quot;/&quot;)x[d]={}for e in all(a)do local a=split(e)local e={unpack(a,1,7)}e[8]={}for x=8,14,2do add(e[8],{unpack(a,x,x+1)})end add(x[d],e)end end poke(24374,@24374^^32)local 𝘤,y,𝘥,g,z,𝘦,d,r,n,b,m,𝘧,s,u,j,𝘨,𝘩,𝘪,o,f,l=unpack(split&quot;0,0,0,0,0,0,0,0,0,0,0x8000,0x1.233b,-0x.52d4&quot;)local c,w,i,h,𝘫,𝘬,k,t,p,v,q,𝘢,𝘣={}e=split&quot;2,0x1.fd17,0x1.fa32,0x1.f752,0x1.f475,0x1.f19d,0x1.eec9,0x1.ebfa,0x1.e92e,0x1.e666,0x1.e3a3,0x1.e0e3,0x1.de27,0x1.db70,0x1.d8bc,0x1.d60c,0x1.d360,0x1.d0b9,0x1.ce14,0x1.cb74,0x1.c8d8,0x1.c63f,0x1.c3aa,0x1.c119,0x1.be8c,0x1.bc02,0x1.b97c,0x1.b6fa,0x1.b47b,0x1.b200,0x1.af89,0x1.ad15,0x1.aaa5,0x1.a838,0x1.a5cf,0x1.a369,0x1.a107,0x1.9ea9,0x1.9c4d,0x1.99f6,0x1.97a1,0x1.9550,0x1.9302,0x1.90b8,0x1.8e71,0x1.8c2e,0x1.89ed,0x1.87b0,0x1.8576,0x1.8340,0x1.810c,0x1.7edc,0x1.7caf,0x1.7a85,0x1.785f,0x1.763b,0x1.741b,0x1.71fd,0x1.6fe3,0x1.6dcc,0x1.6bb8,0x1.69a7,0x1.6798,0x1.658d,0x1.6385,0x1.6180,0x1.5f7e,0x1.5d7e,0x1.5b82,0x1.5988,0x1.5792,0x1.559e,0x1.53ad,0x1.51bf,0x1.4fd3,0x1.4deb,0x1.4c05,0x1.4a22,0x1.4842,0x1.4664,0x1.4489,0x1.42b1,0x1.40dc,0x1.3f09,0x1.3d39,0x1.3b6b,0x1.39a0,0x1.37d8,0x1.3612,0x1.344f,0x1.328f,0x1.30d1,0x1.2f15,0x1.2d5c,0x1.2ba6,0x1.29f2,0x1.2841,0x1.2692,0x1.24e5,0x1.233b,0x1.2193,0x1.1fee,0x1.1e4b,0x1.1cab,0x1.1b0c,0x1.1971,0x1.17d7,0x1.1640,0x1.14ab,0x1.1319,0x1.1189,0x1.0ffb,0x1.0e6f,0x1.0ce5,0x1.0b5e,0x1.09d9,0x1.0857,0x1.06d6,0x1.0558,0x1.03db,0x1.0261,0x1.00e9,0x.ff74,0x.fe00,0x.fc8f,0x.fb1f,0x.f9b2,0x.f847,0x.f6dd,0x.f576,0x.f411,0x.f2ae,0x.f14d,0x.efee,0x.ee91,0x.ed36,0x.ebdd,0x.ea86,0x.e930,0x.e7dd,0x.e68c,0x.e53c,0x.e3ef,0x.e2a3,0x.e15a,0x.e012,0x.decc,0x.dd88,0x.dc45,0x.db05,0x.d9c6,0x.d889,0x.d74e,0x.d615,0x.d4de,0x.d3a8,0x.d274,0x.d142,0x.d012,0x.cee3,0x.cdb6,0x.cc8b,0x.cb61,0x.ca39,0x.c913,0x.c7ee,0x.c6cc,0x.c5aa,0x.c48b,0x.c36d,0x.c251,0x.c136,0x.c01d,0x.bf05,0x.bdef,0x.bcdb,0x.bbc8,0x.bab7,0x.b9a7,0x.b899,0x.b78d,0x.b682,0x.b578,0x.b470,0x.b36a,0x.b265,0x.b161,0x.b05f,0x.af5f,0x.ae5f,0x.ad62,0x.ac66,0x.ab6b,0x.aa71,0x.a979,0x.a883,0x.a78e,0x.a69a,0x.a5a8,0x.a4b7,0x.a3c7,0x.a2d9,0x.a1ec,0x.a100,0x.a016,0x.9f2d,0x.9e45,0x.9d5f,0x.9c7a,0x.9b97,0x.9ab4,0x.99d3,0x.98f3,0x.9815,0x.9738,0x.965c,0x.9581,0x.94a7,0x.93cf,0x.92f8,0x.9222,0x.914e,0x.907a,0x.8fa8,0x.8ed7,0x.8e07,0x.8d39,0x.8c6b,0x.8b9f,0x.8ad4,0x.8a0a,0x.8941,0x.8879,0x.87b3,0x.86ed,0x.8629,0x.8566,0x.84a4,0x.83e3,0x.8323,0x.8264,0x.81a7,0x.80ea,0x.802e,0x.7f74,0x.7eba,0x.7e02,0x.7d4b,0x.7c94,0x.7bdf,0x.7b2b,0x.7a78,0x.79c6,0x.7915,0x.7864,0x.77b5,0x.7707,0x.765a,0x.75ae,0x.7503,0x.7458,0x.73af,0x.7307,0x.725f,0x.71b9,0x.7114,0x.706f,0x.6fcb,0x.6f29,0x.6e87,0x.6de6,0x.6d46,0x.6ca7,0x.6c09,0x.6b6c,0x.6ad0,0x.6a35&quot;a=split&quot;1,0x.fd19,0x.fa3a,0x.f764,0x.f497,0x.f1d1,0x.ef13,0x.ec5e,0x.e9b0,0x.e70a,0x.e46c,0x.e1d5,0x.df46,0x.dcbe,0x.da3d,0x.d7c4,0x.d552,0x.d2e7,0x.d083,0x.ce26,0x.cbd0,0x.c981,0x.c738,0x.c4f6,0x.c2bb,0x.c086,0x.be57,0x.bc2f,0x.ba0d,0x.b7f1,0x.b5dc,0x.b3cc,0x.b1c2,0x.afbf,0x.adc1,0x.abc9,0x.a9d6,0x.a7e9,0x.a602,0x.a421,0x.a244,0x.a06e,0x.9e9c,0x.9cd0,0x.9b09,0x.9947,0x.978a,0x.95d3,0x.9420,0x.9272,0x.90c9,0x.8f25,0x.8d86,0x.8beb,0x.8a55,0x.88c4,0x.8737,0x.85af,0x.842b,0x.82ac,0x.8130,0x.7fba,0x.7e47,0x.7cd9,0x.7b6e,0x.7a08,0x.78a6,0x.7748,0x.75ee,0x.7498,0x.7346,0x.71f7,0x.70ad,0x.6f66,0x.6e22,0x.6ce3,0x.6ba7,0x.6a6f,0x.693a,0x.6809,0x.66db,0x.65b0,0x.6489,0x.6366,0x.6245,0x.6128,0x.600e,0x.5ef7,0x.5de4,0x.5cd3,0x.5bc6,0x.5abc,0x.59b5,0x.58b0,0x.57af,0x.56b1,0x.55b5,0x.54bc,0x.53c7,0x.52d4,0x.51e3,0x.50f6,0x.500b,0x.4f22,0x.4e3d,0x.4d5a,0x.4c79,0x.4b9c,0x.4ac0,0x.49e7,0x.4911,0x.483d,0x.476b,0x.469c,0x.45cf,0x.4505,0x.443c,0x.4376,0x.42b3,0x.41f1,0x.4132,0x.4075,0x.3fba,0x.3f01,0x.3e4a,0x.3d95,0x.3ce3,0x.3c32,0x.3b83,0x.3ad7,0x.3a2c,0x.3983,0x.38dc,0x.3837,0x.3794,0x.36f3,0x.3653,0x.35b6,0x.351a,0x.3480,0x.33e8,0x.3351,0x.32bc,0x.3229,0x.3197,0x.3107,0x.3079,0x.2fed,0x.2f62,0x.2ed8,0x.2e50,0x.2dca,0x.2d45,0x.2cc2,0x.2c40,0x.2bbf,0x.2b40,0x.2ac3,0x.2a47,0x.29cc,0x.2953,0x.28db,0x.2864,0x.27ef,0x.277b,0x.2709,0x.2698,0x.2628,0x.25b9,0x.254b,0x.24df,0x.2474,0x.240a,0x.23a2,0x.233b,0x.22d4,0x.226f,0x.220b,0x.21a9,0x.2147,0x.20e6,0x.2087,0x.2029,0x.1fcb,0x.1f6f,0x.1f14,0x.1eba,0x.1e60,0x.1e08,0x.1db1,0x.1d5b,0x.1d06,0x.1cb2,0x.1c5e,0x.1c0c,0x.1bbb,0x.1b6a,0x.1b1b,0x.1acc,0x.1a7e,0x.1a31,0x.19e5,0x.199a,0x.1950,0x.1907,0x.18be,0x.1876,0x.182f,0x.17e9,0x.17a4,0x.175f,0x.171b,0x.16d8,0x.1696,0x.df50,0x.1614,0x.15d3,0x.1594,0x.1556,0x.1518,0x.14da,0x.149e,0x.cbd9,0x.1427,0x.13ec,0x.13b3,0x.137a,0x.1341,0x.1309,0x.12d2,0x.ba15,0x.1265,0x.1230,0x.11fb,0x.11c7,0x.1193,0x.1160,0x.112e,0x.a9de,0x.10cb,0x.109a,0x.106a,0x.103a,0x.100b,0x.0fdd,0x.0faf,0x.9b10,0x.0f54,0x.0f28,0x.0efc,0x.0ed0,0x.0ea5,0x.0e7b,0x.0e51,0x.8d8c,0x.0dfe,0x.0dd6,0x.0dad,0x.0d86,0x.0d5e,0x.0d38,0x.0d11,0x.8136,0x.0cc6,0x.0ca1,0x.0c7c,0x.0c58,0x.0c34,0x.0c11,0x.0bee,0x.0bcb,0x.0ba9,0x.0b87,0x.0b66,0x.0b45,0x.0b24,0x.0b03&quot;function say(e)local p=split(e,&quot;/&quot;)local d,e,a,n,t,f,m,j,r,v={},{}local s,b,u,w,y,g=unpack(split&quot;1,1,0,0,0,0&quot;)for z in all(p)do local p=tonum(z)if p then local a=abs(p)local e,d,x=sgn(p),a\1,a&amp;.99999 if(d==1)b=1+e*x if(d==2)s=1+e*x if d==3then u=e if(x&gt;0)u*=x end elseif z==&quot;hh&quot;then g=b*440elseif z==&quot;_&quot;then add(c,{1100*b*spk8_rate})else for p in all(x[z])do f,o,m,j,r,i,h,k=unpack(p)a,n,t,v,d,w,e,y={},{},{},f*b,e,y,k,m l=u*spk8_intonation+h*spk8_if0 if(j==0)w=m if(r==0or#d~=#e)d=k for c=1,#d do add(a,{unpack(d[c])})local x,d=a[c],e[c]local e,a=r*(d[1]-x[1]),r*(d[2]-x[2])x.x,x.e,x.d=0,0,0if c&lt;4then e*=spk8_shift a*=spk8_bandwidth end add(n,e/f)add(t,a/f)end if g&gt;0then add(c,{g,2,0,1,0,1,h,a,n,t,e,s,l})g=0end add(c,{v,o,i,w,j*(y-w)/f,y,h,a,n,t,e,s,l})end s,b,u=1,1,0end end end function speaking()return#c&gt;0end function mute()c={}b=0end function speako8()local function x()f=(5512.5/(spk8_pitch+l)+(f and f*49or 0))/(f and 50or 1)end if#c&gt;0then w=c[1]while stat(108)&lt;1920do for k=0,127do if w then if b&lt;1then b,o,i,u,j,𝘨,h,𝘫,𝘩,𝘪,𝘬,𝘣,l=unpack(w)b/=spk8_rate end if o then x()t,d,p=spk8_quality*f,u/8,o*spk8_whisper if p==1then if n%flr(f+.5)==0then r,q,n=-d/(f-1),-d/t/t,0v=-q*t/3x()end if n&gt;t then r=-d/(f-1)else v+=q r-=v end d=r elseif p&gt;1then d=-8for x=1,16do d+=rnd()end if(n&gt;f\2)d/=2 end for n,x in pairs(𝘫)do local b,c,f,o=x[1],x[2]\10+1c=c&lt;=#e and c or#e c=c&gt;=1and c or 1𝘢=cos(b/5512.5)if b&gt;0then f,o=e[c]*𝘢,-a[c]x.d,x.e,x.x=x.e,x.x x.x=(1-f-o)*d+f*x.e+o*x.d d=x.x elseif b&lt;0then f=𝘧*𝘢 local x=1-f-s 𝘤=(d-f*y-s*𝘥)/x 𝘥,y,f=y,d,𝘧*cos(.04897)g=(1-f-s)*𝘤+f*z+s*𝘦 𝘦,z=z,g d=g end local e=𝘬[n] if(b\10~=e[1]\10)x[1]+=𝘩[n] if(c-1~=e[2]\10)x[2]+=𝘪[n] end d*=i/2-1+rnd(i) if(abs(u-𝘨)&gt;abs(j))u+=j else d,𝘣=0,1end n+=1b-=1poke(m+k,d*spk8_volume*𝘣+128)if b&lt;1then deli(c,1)if#c==0then serial(2056,m,k+1)return else w=c[1]end end end end serial(2056,m,128)end end end end --end of speako8_lib_min </pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p></div></div></div></p> <p>Speako8's voice must be configured prior to first use:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function _init() spk8_pitch,spk8_rate,spk8_volume,spk8_quality,spk8_intonation,spk8_if0,spk8_shift,spk8_bandwidth,spk8_whisper= 140,1,1,.5,10,10,1,1,1 end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p><strong><em>Warning: This application may generate loud and harsh sounds. Protect your hearing! Do not test with headphones on and turn down the volume.</em></strong></p> <table> <thead> <tr> <th>Variable</th> <th>Range</th> <th>Explanation</th> </tr> </thead> <tbody> <tr> <td>spk8_pitch</td> <td>60-230</td> <td>Fundamental pitch of voice (F0) in hertz</td> </tr> <tr> <td>spk8_rate</td> <td>.1-2</td> <td>Standard rate of speech divisor&mdash; below 1 is slower; above 1 is faster.</td> </tr> <tr> <td>spk8_volume</td> <td>.1-2</td> <td>Standard volume factor&mdash; below 1 is quieter; above 1 is louder.</td> </tr> <tr> <td>spk8_quality</td> <td>.1-2</td> <td>Glottis open period&mdash; below .5 is creakier voice; .5 is modal voice; 1 is breathy voice; above 1 is weaker voice.</td> </tr> <tr> <td>spk8_intonation</td> <td>0-20</td> <td>Degree of pitch prosody in hertz&mdash; set to zero for robotic monotone.</td> </tr> <tr> <td>spk8_if0</td> <td>0-20</td> <td>Degree to which the inherent pitch (F0) of vowels varies (in hertz)&mdash; set to zero for robotic monotone.</td> </tr> <tr> <td>spk8_shift</td> <td>.8-1.2</td> <td>Factor by which to shift formant frequencies (F1, F2, F3)&mdash; above raises formant frequencies; below one lowers</td> </tr> <tr> <td>spk8_bandwidth</td> <td>.5-5</td> <td>Factor by which to alter bandwidth of formant frequencies (F1, F2, F3)&mdash; below 1 narrows the bandwidth of the formants; above 1 widens. When formants are shifted upward, it is recommended to widen bandwidths as well.</td> </tr> <tr> <td>spk8_whisper</td> <td>1 or 2</td> <td>Speaking mode&mdash; Normal voice is 1; whispering is 2.</td> </tr> </tbody> </table> <p>To enable speech synthesis, you must call <code>speako8</code> in the <code>_update</code> function. Then call <code>say</code> with a speech string:</p> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function _update() speako8() -- must appear once unconditionally in _update. if btnp(5) then --❎ button -- use speaking if you want to check if anything is currently being said. -- if not speaking() then say(&quot;_/hh/-1.57/eh/-1.07/l/-1.33/3/ow/-1.03/-3/w/1.27/-3/er/1.65/-3/l/-1.64/-3/_/d&quot;) -- end elseif btnp(4) then -- 🅾️ button mute() --flushes the sound queue and immediately stops whatever is currently being said. end end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <p>Speech strings represent text phonetically and include prosody markup. The easiest way to create and test them is with the <a href="https://bikibird.itch.io/declare">Declare</a> web app. You can also try out different voice options with it.</p> <p>If you are interested in learning more about speech synthesis, try googling these key words: Klatt synthesizer, formant, acoustic phonetics. It's a fascinating topic. An unminimized version of the library is included in the demo cart.</p> <p>Special thanks to the gang on the Discord server for lending me their ears and keeping me motivated, especially <a href="https://www.lexaloffle.com/bbs/?uid=40166"> @packbat</a>, who did it for science. Thanks also to <a href="https://www.lexaloffle.com/bbs/?uid=11031"> @IMLXH</a> for finding the Klatt prosody rules.</p> https://www.lexaloffle.com/bbs/?tid=49108 https://www.lexaloffle.com/bbs/?tid=49108 Tue, 30 Aug 2022 19:14:15 UTC Defy: PCM Boombox and Audio String Library <p> <table><tr><td> <a href="/bbs/?pid=109080#p"> <img src="/bbs/thumbs/pico8_defy-9.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=109080#p"> Defy: PCM Boombox and Audio String Library</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=109080#p"> [Click to Play]</a> </td></tr></table> </p> <h1>Defy Audio Player</h1> <p>The Defy Audio Player plays Defy formatted audio files via PICO-8's PCM channel. It's a PCM boombox! You can also use it to create binary strings of audio data for playback in your own cartridges.</p> <p>Convert almost any audio file format to .defy here: <a href="https://bikibird.itch.io/defy"><a href="https://bikibird.itch.io/defy">https://bikibird.itch.io/defy</a></a>.</p> <p>This cart is intended to run in PICO-8, not play on the BBS, which is limited to a maximum files size of 250K. Instead, open PICO-8 and enter <code>load #defy</code>. Then enter <code>run</code>. </p> <h2>Controls</h2> <ul> <li>Drag and drop your .defy file onto PICO-8 to play it. You do not have to wait for a file to finish before loading another.</li> <li>Press 🅾️ (z key) to pause playback. Press it again to resume.</li> <li>Press ⬅️ or ➡️ to switch visualizers.</li> <li>Press ⬆️ to eject and stop playback.</li> <li>Press ⬇️ to display title and format.</li> <li>Press ❎ to record binary string. If you press record prior to playing the file, Defy will start recording it as soon as the file is dropped. The binary string is copied to your computer's clipboard.</li> </ul> <h2>Audio String Player</h2> <p>The library below plays Defy formatted audio strings. For support for <a href="https://www.lexaloffle.com/bbs/?uid=24137"> <a href="https://www.lexaloffle.com/bbs/?uid=24137"> <a href="https://www.lexaloffle.com/bbs/?uid=24137"> @luchak</a></a></a>'s QPA formatted audio strings see <a href="https://www.lexaloffle.com/bbs/?tid=53933"><a href="https://www.lexaloffle.com/bbs/?tid=53933">https://www.lexaloffle.com/bbs/?tid=53933</a></a> and <a href="https://github.com/luchak/qpa-format/"><a href="https://github.com/luchak/qpa-format/">https://github.com/luchak/qpa-format/</a></a>.</p> <p><em>Warning: Be careful testing new audio strings. Playback with a mismatched playback mode sounds terrible. Do not test with headphones. Protect your hearing.</em></p> <p>When record is pressed, the first 32,000 bytes of audio data are copied to the clipboard as a binary string during playback. Use the code below in your own carts to play the binary string. Be aware that only a few seconds of audio will fit in a cart. If the captured string contains too much data, you may truncate it. One second of audio equates to approximately 5500, 2250, 1840, 1125, and 690 characters for 8, 4, 2.6, 2, and 1 bit formats respectively.</p> <ul> <li>Paste the library below into a new cart. </li> <li>To save tokens, delete defy_play functions for any unused bit formats</li> </ul> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>do --defy audio string library by bikibird local buffer=0x8000 -- required all formats local clips={} -- required all formats local cued -- required all formats -- locals required for 4, 2.6, 2, and 1 bit formats below local step, new_sample, ad_index,c,direction local index_table = {[0]=-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8} local step_table ={7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118,130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767} local adpcm=function(sample,bits) --adapted from http://www.cs.columbia.edu/~hgs/audio/dvi/IMA_ADPCM.pdf if bits &gt;1 then local delta=0 local temp_step =step local sign = sample &amp;(1&lt;&lt;(bits-1)) --hi bit of sample convert to 4 bit local magnitude =(sample &amp; (sign-1))&lt;&lt;(4-bits) -- convert sample to 4 bit sign &lt;&lt;=(4-bits) -- convert sign to 4 bit 8==negative 0== positive local mask = 4 for i=1,3 do if (magnitude &amp; mask &gt;0) then delta+=temp_step end mask &gt;&gt;&gt;= 1 temp_step &gt;&gt;&gt;= 1 end if sign&gt; 0 then -- negative magnitude if new_sample &lt; -32768+delta then new_sample = -32768 else new_sample-=delta end else -- positive magnitude if new_sample &gt;32767-delta then new_sample =32767 else new_sample +=delta end end ad_index += index_table[sign+magnitude] else --1-bit if sample==1 then -- negative if new_sample &lt; -32768+step then new_sample = -32768 else new_sample-=step end else -- positive if new_sample &gt;32767-step then new_sample =32767 else new_sample +=step end end if sample==direction then --if direction same, try larger step. if changed, try smaller step ad_index+=1 else ad_index-=1 direction =sample end end if ad_index &lt; 1 then ad_index = 1 elseif (ad_index &gt; #step_table) then ad_index = #step_table end step = step_table[ad_index] return new_sample\256+128 end defy_load=function(clip) -- required all formats add(clips,{clip=clip,start=1,endpoint=#clip, index=1, loop=false, done=false}) end local cued=false -- required all formats defy_cue=function(clip_number,start,endpoint,looping) --required all formats clips[clip_number].start=start or clips[clip_number].start clips[clip_number].index=clips[clip_number].start clips[clip_number].endpoint=endpoint or #clips[clip_number].clip clips[clip_number].loop=looping or false clips[clip_number].done=false step, new_sample, ad_index,delta,direction=7,0,0,0,0 cued=clip_number end defy_play= { [8]=function() -- 8 bit format if cued and not clips[cued].done then while stat(108)&lt;1536 do for i=0,511 do poke (buffer+i,ord(clips[cued].clip,clips[cued].index)) clips[cued].index+=1 if (clips[cued].index&gt;clips[cued].endpoint) then if (clips[cued].loop) then clips[cued].index=clips[cued].start else serial(0x808,buffer,i+1) clips[cued].done=true return end end end serial(0x808,buffer,512) end end end, [4]=function() -- 4 bit format if cued and not clips[cued].done then while stat(108)&lt;1536 do for i=0,255 do c=ord(clips[cued].clip,clips[cued].index) poke (buffer+i*2,adpcm((c&amp;0xf0)&gt;&gt;&gt;4,4),adpcm(c&amp;0x0f,4)) clips[cued].index+=1 if (clips[cued].index&gt;clips[cued].endpoint) then if (clips[cued].loop) then clips[cued].index=clips[cued].start else serial(0x808,buffer,i+1) clips[cued].done=true return end end end serial(0x808,buffer,512) end end end, [3]=function() -- 3 bit format if cued and not clips[cued].done then while stat(108)&lt;1536 do for i=0,170 do c=ord(clips[cued].clip,clips[cued].index) poke(buffer+i*3, adpcm((c&gt;&gt;&gt;5)&amp;0x07,3), adpcm((c&gt;&gt;&gt;2)&amp;0x07,3), adpcm(c&amp;0x03,2,true)) clips[cued].index+=1 if (clips[cued].index&gt;clips[cued].endpoint) then if (clips[cued].loop) then clips[cued].index=clips[cued].start else serial(0x808,buffer,i+1) clips[cued].done=true return end end end serial(0x808,buffer,510) end end end, [2]=function() -- 2 bit format if cued and not clips[cued].done then while stat(108)&lt;1536 do for i=0,128 do c=ord(clips[cued].clip,clips[cued].index) poke(buffer+i*4, adpcm((c&gt;&gt;&gt;6)&amp;0x03,2), adpcm((c&gt;&gt;&gt;4)&amp;0x03,2), adpcm((c&gt;&gt;&gt;2)&amp;0x03,2), adpcm(c&amp;0x03,2)) clips[cued].index+=1 if (clips[cued].index&gt;clips[cued].endpoint) then if (clips[cued].loop) then clips[cued].index=clips[cued].start else serial(0x808,buffer,i+1) clips[cued].done=true return end end end serial(0x808,buffer,512) end end end, [1]=function() -- 1 bit format if cued and not clips[cued].done then while stat(108)&lt;1536 do for i=0,64 do c=ord(clips[cued].clip,clips[cued].index) poke(buffer+i*8, adpcm((c&gt;&gt;&gt;7)&amp;1,1), adpcm((c&gt;&gt;&gt;6)&amp;1,1), adpcm((c&gt;&gt;&gt;5)&amp;1,1), adpcm((c&gt;&gt;&gt;4)&amp;1,1), adpcm((c&gt;&gt;&gt;3)&amp;1,1), adpcm((c&gt;&gt;&gt;2)&amp;1,1), adpcm((c&gt;&gt;&gt;1)&amp;1,1),adpcm(c&amp;1,1)) clips[cued].index+=1 if (clips[cued].index&gt;clips[cued].endpoint) then if (clips[cued].loop) then clips[cued].index=clips[cued].start else serial(0x808,buffer,i+1) clips[cued].done=true return end end end serial(0x808,buffer,512) end end end } function eject() -- required all formats clips[cued].done=true end end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <ul> <li>Record some audio in the Defy Player. Once the binary string is created, playback will pause while the binary string is copied to the clipboard and then resume</li> <li>In <code>_init()</code> add one or more load statements to add your audio clips to the clip table. Turn on puny font by pressing ctrl-p before pasting your string. <strong>Failing to do so will corrupt the string and distort the audio.</strong></li> </ul> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function _init() defy_load&quot;my audio string&quot; --Turn on puny font (ctrl-p) before pasting!!! end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <ul> <li>The <code>cue</code> function must be called before your audio string may be played. Cue your clip in the <code>_update</code> function. Use whatever logic you would use when using <code>sfx()</code>. Cue may also be called with additional parameters: <code>defy_cue(clip_number,start,endpoint,looping).</code> <code>start</code> and <code>endpoint</code> are indexes into the string. <code>looping</code> is a boolean.</li> <li>Add a playback mode in <code>_update</code>, <code>defy_play[format]()</code>. Where format is 8, 4, 3, 2, or 1, corresponding to 8-bit, 4-bit, 2.6-bit, 2-bit, or 1-bit.</li> </ul> <div> <div class=scrollable_with_touch style="width:100%; max-width:800px; overflow:auto; margin-bottom:12px"> <table style="width:100%" cellspacing=0 cellpadding=0> <tr><td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> <td background=/gfx/code_bg0.png> <div style="font-family : courier; color: #000000; display:absolute; padding-left:10px; padding-top:4px; padding-bottom:4px; "> <pre>function _update() if (btnp(4)) then defy_cue(1) -- cues clip 1 for play from beginning to end, no looping. end defy_play[4]() -- play back of 4-bit audio string. called unconditionally in _update. end</pre></div></td> <td background=/gfx/code_bg1.png width=16><div style="width:16px;display:block"></div></td> </tr></table></div></div> <ul> <li>Use <code>defy_eject(clip_number)</code> to end a clip early or stop a looping clip.</li> </ul> <h2>Acknowledgements</h2> <p>Thank you, <a href="https://www.lexaloffle.com/bbs/?uid=24137"> <a href="https://www.lexaloffle.com/bbs/?uid=24137"> <a href="https://www.lexaloffle.com/bbs/?uid=24137"> @luchak</a></a></a> and <a href="https://www.lexaloffle.com/bbs/?uid=40166"> @packbat</a>, for all your sound advice. Thank you, <a href="https://www.lexaloffle.com/bbs/?uid=24137"> <a href="https://www.lexaloffle.com/bbs/?uid=24137"> <a href="https://www.lexaloffle.com/bbs/?uid=24137"> @luchak</a></a></a> for the antialiasing filter. Thank you, <a href="https://www.lexaloffle.com/bbs/?uid=46538"> @Gabe_8_bit</a> for feedback and your fancy oscilloscope code. It formed the basis of the simpler oscilloscope that was ultimately included. Thank you, <a href="https://www.lexaloffle.com/bbs/?uid=37415"> @LazarevGaming</a>, et al, for testing and feedback.</p> https://www.lexaloffle.com/bbs/?tid=47089 https://www.lexaloffle.com/bbs/?tid=47089 Wed, 23 Mar 2022 21:56:25 UTC Lektrik Sportz Game <p> <table><tr><td> <a href="/bbs/?pid=107707#p"> <img src="/bbs/thumbs/pico8_lektrik_sportz-1.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=107707#p"> Lektrik Sportz Game</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=107707#p"> [Click to Play]</a> </td></tr></table> </p> <h1>Lektrik Sportz Game</h1> <h3>A Captain Neat-o Adventure</h3> <p>Let's get one thing straight. This is not Electric Football&trade;. Doctor Lamento destroyed the football years ago because, you know, he's evil. But, I get ahead of myself. This is the story of Captain Neat-o who is far from home and falls into the clutches of Doctor Lamento.</p> <p>The evil Doctor forces our hero to face off against his most formidable opponent, Neat-o himself, in a spectacle the Doctor calls Lektrik Sportz Game (because he can't spell and, you know, he's evil.)</p> <h2>Game Play</h2> <p>Run from one end of the field to the other while avoiding your opponents. You should make it home in under 5 minutes. Don't fall off.</p> <p>Your teammates can help block the opponents and you can set their overall direction and confrontation style in the strategy session.</p> <p>If you are using a keyboard to play, use the X key to advance to the next screen/teammate and the Z key to switch modes in the strategy session. Arrow keys select options, set direction, and move teammates.</p> <p>The visiting team's strategy is randomly generated, but set for a single day. Learn their strategy over multiple plays and eventually defeat them in a single down! Then, come back tomorrow and play a new challenge.</p> <h2>Poetry Corner (Spoilers)</h2> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>The Story So Far</h3> <p>Captain Neat-o floats in space,<br /> So helpless and out of place.</p> <p>His situation is dire...<br /> Suddenly there's ray gun fire!</p> <p>Freeze! Shrink! Mimeo! and Drop!<br /> Doctor Lamento wont stop...</p> <p>Pawn Neat-o battles his clones!<br /> &quot;Too formidable!&quot; he groans.</p> <p>&quot;Then I will give you teammates.<br /> Strategize while fate awaits...</p> <p>I act with hostility!<br /> Engage the utility!&quot;</p> <p>Honest Neat-o, head crowned gold,<br /> Propels toward home. Behold...</p> <p>Hero, his green band flashing,<br /> Cuts a figure so dashing.</p> <p>Lektrik electrickery!<br /> Oh, what wicked wickery!</div></div></div></p> <p><div><div><input type="button" value=" Show " onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = ' Hide '; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = ' Show '; }"></div><div><div style="display: none;"></p> <h3>The End?</h3> <p>Stout hearted Captain Neat-o,<br /> His story not finito,<br /> Enlarged by experience,<br /> Mastered fate imperious.</p> <p>So, on to new adventures...<br /> Despite the past's vast treasures,<br /> Hidden futures still unfold<br /> Awesome epics to be told.</div></div></div></p> <h2>Credits</h2> <p>All assets used in the making of this game are courtesy of <a href="https://itch.io/jam/toy-box-jam-3">Toy Box Jam 3</a>. I borrowed <a href="https://www.lexaloffle.com/bbs/?uid=39676"> @Mot</a>'s <a href="https://www.lexaloffle.com/bbs/?tid=37982">Instant 3D Plus!</a> library and hacked it a bit to get an additional camera angle. All other code, the poetry, and the idea for this adventure are my own.</p> https://www.lexaloffle.com/bbs/?tid=46760 https://www.lexaloffle.com/bbs/?tid=46760 Sat, 26 Feb 2022 21:38:23 UTC Christmas Sneks 2: Home for The Holidays <p> <table><tr><td> <a href="/bbs/?pid=103502#p"> <img src="/bbs/thumbs/pico8_christmassneks2021-3.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=103502#p"> Christmas Sneks 2: Home for The Holidays</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=103502#p"> [Click to Play]</a> </td></tr></table> </p> <p>This is the story of a hard working Christmas elf. I was never told their name. I call them Blinky. They had one last task to complete late one Christmas Eve: String some lights, plug them in, and connect them to the finial atop the tree. Easy for a smart elf like Blinky. Too bad they never finished that electrician's course...</p> <h1>Game Play</h1> <p>Connect the loose bulbs by touching them with the exposed wire from the light string. Loose bulbs are always safe, but if the string is connected to power and you touch the string to itself, some of the bulbs will explode. Electricity is powerful, but dangerous. Be careful with it. </p> <p>There are three possible endings and eleven achievements to earn.</p> <h1>Controls</h1> <p>Press the Z key to disconnect the light string to/from the power outlet.</p> <p>Press the X key to disconnect the light string to/from the finial.</p> <p>Arrow keys set the direction of travel. If you wander off screen you will hear warning notes. Come back before you wander too far.</p> https://www.lexaloffle.com/bbs/?tid=45851 https://www.lexaloffle.com/bbs/?tid=45851 Sat, 25 Dec 2021 01:41:37 UTC Denote: MIDI File Demake Tool <p>I made a web-based tool for extracting and converting MIDI file data to be played in PICO-8. It's nicely interactive and includes a PICO-8 console built into the page so that you can audition the results before you copy the SFX data. <a href="https://bikibird.itch.io/denote">Give Denote a try</a> and let me know what you think.</p> https://www.lexaloffle.com/bbs/?tid=43514 https://www.lexaloffle.com/bbs/?tid=43514 Thu, 24 Jun 2021 22:48:44 UTC Accidental Musical Composition <p>So, I've been working on a web based MIDI to PICO-8 converter for a while now. It was going pretty well, but today I introduced a bug, which totally corrupted the SFX data. The input was the traditional melody, Ghost Of John. The output was this:</p> <p> <iframe src="sfxp2.php?id=49583_2" width="402" height="300" style="border:none; overflow:hidden" scrolling="no" allow="autoplay"></iframe><a style="cursor:pointer; font-size:8pt" onclick=' var el = document.getElementById("sfxcode_49583_2"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("/bbs/sfxc/49583_2.txt", function (retdata){ var el = document.getElementById("sfxcode_49583_2"); el.innerHTML = retdata; el.focus(); el.select(); } ); '> [sfx] </a> <textarea rows=3 class=lexinput id="sfxcode_49583_2" style="width:480px;background-color:#fed;display:none;overflow:hidden; font-size:4pt;"></textarea> </p> <p>Surprisingly, I like the way it sounds. I guess I composed some original music here, but it was completely accidental. I guess if you make enough mistakes, some of them are bound to turn out ok.</p> <p>Now I just need to figure out what kind of game goes with this soundtrack. Any suggestions? Feel free to use this in your own projects if it fits.</p> https://www.lexaloffle.com/bbs/?tid=43357 https://www.lexaloffle.com/bbs/?tid=43357 Wed, 16 Jun 2021 17:26:42 UTC Iris Effect Coroutine <p> <table><tr><td> <a href="/bbs/?pid=92059#p"> <img src="/bbs/thumbs/pico8_circularthinking-0.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=92059#p"> circularthinking</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=92059#p"> [Click to Play]</a> </td></tr></table> </p> <p>In my <a href="https://www.lexaloffle.com/bbs/?tid=42565">last game</a>, I included an iris effect to transition between two scenes. I used the midpoint circle algorithm to calculate the edges of the iris. This algo avoids trig and square root functions and so is super fast. Even at 60 frames a second, there's no lag. I decided to make a more generalized version, implemented as a coroutine. I hope you find it useful for your projects.</p> <p>To use: </p> <ul> <li> <p>Copy the iris function from the cartridge above into your own cartridge.</p> </li> <li> <p>When it's time for a transition, assign the coroutine to a variable in your update function: <code>effect = cocreate(iris)</code></p> </li> <li>In the draw function, call the coroutine: <code>coresume(effect, 1, 128, 1, 15)</code></li> </ul> <p>The parameters for the coroutine are starting radius, ending radius, step, and color. A positive step indicates by how much to open the iris on each frame. A negative step indicates a shrinking iris. See the code for examples.</p> https://www.lexaloffle.com/bbs/?tid=42919 https://www.lexaloffle.com/bbs/?tid=42919 Sun, 16 May 2021 23:58:15 UTC Ice Cream Clouds <p> <table><tr><td> <a href="/bbs/?pid=90911#p"> <img src="/bbs/thumbs/pico8_icecreamclouds-1.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=90911#p"> Ice Cream Clouds</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=90911#p"> [Click to Play]</a> </td></tr></table> </p> <p>Straight from the laboratory of Professor von Stroopwafel is a modest proposal to solve global climate change. Enjoy a lighthearted romp through a speculative future. It even has bells and whistles. Happy Earth Day, everyone.</p> <h2>Game Play</h2> <p>Catch falling scoops of ice cream and toppings to fulfill as many orders as possible before the timer runs out.</p> <h2>Controls</h2> <p>Press the X key to advance to the next screen.</p> <p>Left and right keys move the cone.</p> <p>Use the Z key at any time to see the ice cream order. Press Z again to dismiss it. The timer is always running so try not to look at the order too long or too often.</p> https://www.lexaloffle.com/bbs/?tid=42565 https://www.lexaloffle.com/bbs/?tid=42565 Thu, 22 Apr 2021 00:31:37 UTC Bicycle/Ice Cream Bell <p>I'm working on an SFX that is supposed to sound like a bicycle bell, well actually an ice cream bell. Here's what I have so far:</p> <p> <iframe src="sfxp2.php?id=49583_1" width="402" height="300" style="border:none; overflow:hidden" scrolling="no" allow="autoplay"></iframe><a style="cursor:pointer; font-size:8pt" onclick=' var el = document.getElementById("sfxcode_49583_1"); if (el.style.display == "none") el.style.display = ""; else el.style.display = "none"; microAjax("/bbs/sfxc/49583_1.txt", function (retdata){ var el = document.getElementById("sfxcode_49583_1"); el.innerHTML = retdata; el.focus(); el.select(); } ); '> [sfx] </a> <textarea rows=3 class=lexinput id="sfxcode_49583_1" style="width:480px;background-color:#fed;display:none;overflow:hidden; font-size:4pt;"></textarea> </p> <p>Do you find it convincing? Do you have advice on making it better? If you have a better SFX of a bicycle or ice cream bell ding, please share.</p> https://www.lexaloffle.com/bbs/?tid=42300 https://www.lexaloffle.com/bbs/?tid=42300 Sun, 04 Apr 2021 15:12:17 UTC Depict: Image Demake Tool <p>I made an image demake tool for PICO-8. Load any image and create a dithered image that uses PICO-8 standard colors and/or hidden colors and is reduced to a maximum width and height of 128 x128. Depict supports Ordered, Atkinson, Floyd-Steinberg, and Sierra2 dithering as well as some artistic dithers: Rivers, Streets, Rain, Wind. Drag and drop the final result into the PICO-8 sprite sheet. Free on itch: <a href="https://bikibird.itch.io/depict">Depict</a></p> <p>All feedback welcomed.</p> <p>Mix and match standard and hidden colors, but do do not exceed 16.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/download (20).png" alt="" /> <p>Rivers dither adds horizontal ripples.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/download (24).png" alt="" /> <p>Streets dither creates maze-like artifacts.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/download (26).png" alt="" /> <p>Rain dither makes vertical steaks.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/download (25).png" alt="" /> <p>Wind dither produces slashes.</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/download (23).png" alt="" /> <p>Atkinson Dither</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/download (22).png" alt="" /> <p>Ordered Dither</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/10_download (15).png" alt="" /> <p>No Dither</p> <img loading="lazy" style="margin-bottom:16px" border=0 src="/media/49583/download (16).png" alt="" /> https://www.lexaloffle.com/bbs/?tid=41358 https://www.lexaloffle.com/bbs/?tid=41358 Mon, 01 Feb 2021 01:14:16 UTC Christmas Sneks 1 <p> <table><tr><td> <a href="/bbs/?pid=85777#p"> <img src="/bbs/thumbs/pico8_christmassneks-5.png" style="height:256px"></a> </td><td width=10></td><td valign=top> <a href="/bbs/?pid=85777#p"> Christmas Sneks 1: Into the Woods</a><br><br> by <a href="/bbs/?uid=49583"> bikibird</a> <br><br><br> <a href="/bbs/?pid=85777#p"> [Click to Play]</a> </td></tr></table> </p> <p>My first Pico-8 game. Entered in Toy Box Jam 2020.</p> <p>Tis the season to sing carols, drink nog, and decorate the night with Christmas sneks. </p> <p>Press an arrow key to change the direction of the snek and connect bulbs to the live wire at the front of the snek to light them up. Build a long snek or a short snek. Ride the high speed rail to get around faster.</p> <p>This is a mellow game with no set goals, but beware! If you touch the live wire to the snek you will create a short circuit!</p> <p>When you are happy with your snek, press X to go to the forest and plant a tree decorated with your snek. Then go build another snek so you can plant another tree. </p> <p>Merry Christmas and may 2021 bring you only good things.</p> https://www.lexaloffle.com/bbs/?tid=40926 https://www.lexaloffle.com/bbs/?tid=40926 Fri, 25 Dec 2020 20:17:53 UTC