Skip to content

Commit af2ac9a

Browse files
authored
version 2.0.4
1 parent 4dffb8b commit af2ac9a

File tree

16 files changed

+137
-25
lines changed

16 files changed

+137
-25
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ TODO.md
55
stub.lua
66
CHANGELOG.md
77
CS-16.pdx.zip
8+
CS-16.pdx_withExtraVisualizers.zip

MANUAL.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,6 @@ If you would like to change an effect intensity (signified by the decimal number
143143

144144
In the `song` screen, you can view and modify your song's global options, such as the tempo and pattern length (these can be modified via the crank). Your song name and author name is displayed at the top.
145145

146-
> IMPORTANT NOTE! currently, the tempo can only be changed by intervals of 7.5 because of a bug in Playdate OS. as soon as a fix is implemented, this message will be deleted.
147-
148146
Here you can also save and load your songs via the Playdate OS menu. If you select `load`, you can also perform file operations on your songs, such as renaming, deleting, and cloning. You can press `right` to view file metadata as well.
149147

150148
![](assets/fileops.gif)
@@ -160,15 +158,16 @@ In the system menu, you can also access and change CS-16 settings, such as dark
160158
- `behavior/`
161159
- `play on load` (play pattern immediately on song load)
162160
- `stop if sampling` (stop the pattern if you are currently sampling audio)
161+
- `precise tempo chg` (enables precise tempo editing [increment / decrement tempo by 0.1 instead of 1 when editing])
163162
- `tempo edit stop` (stop the pattern when tempo is modified)
164-
- `save .wav samples` (alongside .pda audio, save .wav files when sampling)
165163
- `crank docked screen` (which screen appears when the crank is docked. `none` disables changing the screen)
166164
- `recording/` (as in tapping in a pattern)
167165
- (button) `button track` (when record is active, this button will correspond to this track)
168166
- `quantization` (quantize recording, can be either off [1], every 16th note [2], or every 8th note [4])
169167
- `sampling/`
170168
- `sample format` (16 bit or 8 bit)
171169
- `save waveforms` (save waveform images along with audio)
170+
- `save .wav samples` (alongside .pda audio, save .wav files when sampling)
172171
- `ui/`
173172
- `dark mode`
174173
- `visualizer` (song screen visualizer options)

assets/banner.png

11.7 KB
Loading

justfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,9 @@ release:
3838
just build
3939
-rm CS-16.pdx.zip
4040
zip -rq CS-16.pdx.zip CS-16.pdx
41+
42+
mv visualizers/ src/
43+
pdc -q -sdkpath ~/Documents/PlaydateSDK/ src CS-16
44+
mv src/visualizers .
45+
-rm CS-16_withExtraVisualizers.pdx.zip
46+
zip -rq CS-16_withExtraVisualizers.pdx.zip CS-16.pdx

src/fnt/modified-tron-8x8.fnt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
--metrics={"baseline":6,"xHeight":2,"capHeight":3,"pairs":{},"left":[],"right":[]}
2-
datalen=1712
3-
data=iVBORw0KGgoAAAANSUhEUgAAAFAAAABICAYAAABhlHJbAAAEyklEQVR4Xu2cbXPcMAiEm///o5u5m9gl3MIuCPvi1P2UVkJCK14eeTr5+HP/WVLg48v6b7DKNo6GHzaqPVrfrt0Zf/i0sr+1f/zsfWD+Pe2tA14sK5AiYMXer139u/cH+VrxfxMw0iNcf0pAJrAdtzetOlwVQ0nL7NLYhe6CdwXcRFBTCEWMT0GfMlIKNUtQ1f+wxE0LmNVMFIVHXoCvcWx/dGHRefYL8AfIooA5gIpylqLRAX10+PpkC35n/VH7yQhAdaezfiTg1PqRgNn6YQlSU85HX8dOKeyXm1MVAnXQ7dBVjppsEoxjJ8YhplUEZK3dgzXrqqzeZusxblM4kWWVtL8qoK1L28IIBbpc1+E8dkAm0Or4c39FwOiZ5UVdKfKocWRdH0Wg35+ViAxbZE5UBLRda0MPXwsZenTGOwJSbgu6VMc/OQKjJmE5ru3A1+JH2LMLYOO+RHhuLQto0wY1FLiBEyhKs4kuqZQQFqHMv5fGp6bw5fjsLIch2wibV5DGF3y0/FkRyCKsMv7U7icJ6BGIYQrjTl+js7MijGLr3wKaABoVEEWmD22Zk5IuG3VBC+rq1yJFANZkWIRCe2S0ImD0PKuA8pECZl24AtZ7XVcFZNjS4bh3ROBbBWQpMMGBjwN2I7DqH7pA1oVvDhQQrTTFF2l2A9m4UoSzGskwhkW4sn/k/1bT7Lj0MSL6/BTBL+p2ylylRh4tIGNeifsMVXzjwEgYhC+oEKsY8a4IRGmZvabkl5aawpsDEY4oEZa9DKw9aiIsxdg4eiqyFPX+ShzYEco6H0WYT/MMizpduOt3ZudTGtbgqAZWIu2qAkoCmZpHBcw4Sr3hyS6HUiiL8OgiUXpvflaeiqUURpPvfwMKqE3kJ3yvYxgS4VS1A6N1QkpROVDBlOidqRyssz6zyTJGxhRTA+H5MgGtA8xZxpFHjDOfThfQdxkvIOxCrktZG8ZZlc9HrISwJufF9JTB1o+o5OX/GGefexQBK/adC+p2YVXA7KUEA6zaxssbJBx1poAZuEf4wzjx6f/ZXZhFqI8U9YJZCndSFAn44l/WOW/uExQ4OwJZhFXGWZOqZljGmeHHEoQx0WOebcC6asXes2OV2yL2jHCKIdF/KSBKwEMF3EK+8zlJvcEsRVmEIkHUEqQ2GZUy9vOiLnekgFkXZiUg41DGeasChiXltwjIOO8SAiopdhQHMs5TBYxKjIXtbc7zLDcHCqyXTalgTFaDVpvI4jF2c/96mAoQ6WOCF5O9BZmzlfFbQFAOqt8AUR2rRJBaBzuXJUVgxoFhETXe+AOwpxbivqyIKwdHCKbYsTnLAoZPGbdztFHoAPNcHD8y+mzwvGTEFAeqmBCRPtNJuQBWc9kerXH1KTQVgd0UfbeANIVb6t9GN0j75qi8lL7Nyb6A2ABTUuiqAameDc67Bfz3G4sYc6YCrkLsVaMvRRQF0dQIvLJAzPc7hZlCZHxUwGgvdZPFs7zF3Jav5S48cYLfLPaLPqzzdASNXi2PtdgNd8c7fo7YTAvY+ZigRqw6b0QYdRFFwAriZAKuRtdlBVQvo3tA1U6dp/o7Mm8yArsHVO3UeSPCqIt0v8/59VcOp9qq89Szj8xDH1Q7C68ejtmz8Y7PIzafD03xZ0iqhq8AAAAASUVORK5CYII=
2+
datalen=1704
3+
data=iVBORw0KGgoAAAANSUhEUgAAAFAAAABICAYAAABhlHJbAAAEw0lEQVR4Xu1abZvaMAzb/v+P3p4ywoxOtuSkLQdXfRqkcWxFfim7378uLOH3ffefxMpYZ9j2uPuZ/Wh7Zn3Dyvlx/wb0Qfl32x8dQLIiQQ6Bnf1ou/sZwXzt+D8IzPhI7e9FoCI4It6063CXDAfVpVVrA7dnZgkcJLgpxBSDKYgpY6XQZAnq+p+WuL0JxDTO0A1g5gKwxrEsqDLA2o83WKlAOYAHYpNhimKEI7lYn8ZnpWCLgKBg17+n85FABAswC4Bhxn5G4F72Z/xHPHzMCKqgCvqPQpdA1kEHunMUS5ksA9D2gKvwPfbTMQ2/7ChvZQyo9sYLyWrUSMNqPUJljZoj5RyoEOvSMMY6aRaQIuyIAFcJVPuf5kClPJZaSCpDN8XcpsUUyHzMysuGquvaY1bmMAJrX/Y5G4PQoYyAVQI7+1FhjFQ55rkEjoCzW54hCOfEqQDuDrHzFUFq3fKvQ2BUDatpDgHqAo5eVwpV53/JsC6BFwB0tjFY6nZVp8syYIoqhZy5fvPtOxGII1D1Lh3LCf57fI7xTc959xtJBXMR+A9dgh/PMwKZMhH2nBQcrOxmg3q1v6tQVSIqMaWvgnsT2JkDI84iEOMdUFNFOqa5BE4f8M0U+FICGSqC2CCquuRmL75rH2GfIU3RQgD2u/CFAsiwUki17hThqkaqMQab0J5NZAOqEH2lsWdzzjBYkYJNoHo2LcIhRY4mUMVSXYicA9WbQtatqu+tl/GTCMzqnpMRTExf5kBVRCNRmEpR/u4YU3V11kRUiql1Fp9K0RinPQfOEOUQiLfYJVCVgFm/q31WBmU1kDmcEfWuBFoEhRKDmfc0xuyVwogqTWZSKCsRlZJYeg9IgoBAxPV74Cokw+oGTlxXYwjW2QrpWBLiUWp/ymk2xnQHVQwwgtlX653zs8AznELgaoBq/+q6uvTTFbghU5EaI2bmLNZEsqK+2uQQGI+yj88/kDmsDsR6kx4QasoeF6TqkvIj88cVyBeBVQSuzkmYoq8ksBrchxjQPxX/0wZXwgi8ALWuSkRnf1YD2UW58WUKb7/KXTDRVZBSyJnrrAmtnF/NmWmN7PycpA5QXbWzf9Ql5h+usc+d75xnfySBDNlAr2ZKi8BRfIcx1YU6bwpOEVcKZXBL0AAjYigQm08V/2ONjTFHEogkxcBUCagCRHSIcghMS8qnEKjmvFUFnkKgk2KVArv7WYohWFlAJUcFVvuxDN1sZwFdMNEZY6oa5Hax6ob3gGpss7B+TEAyqy6U1oQAFQwjfRXqzFm8nECGrPBHdEoM1qiBjo0MFoEjRdkYMxRXBUeL7B24huWA2WfPKGS+r2KZwHQSB8+689deYBc0cwGHKfAIAjs1kJ2POKr+lcBBGsEG7ZiWXQVm9hVeTaBM4QuTQAX9RMT66bwpPT3DUpAZcVLoXeHGRp+7CPz/l6kqG0sCnTntU3GKAj8ZpxDoHvKOcGOzamAG95B3xK5deA98MtnTbwIdZK99G9ScNbPuvmYeAtW6u5j5McFVrGvbtbcLHAI7I04V5Iy6IhxinGd2hUOgi1nn3X3qObV+CBwCXQXOBuDuq55zbewO/M9sh1CGlQDcvd+6BrpBHDUnqvOV+qq/ajgUfwF1r/xn/jkm2QAAAABJRU5ErkJggg==
44
width=8
55
height=8
66

@@ -16,7 +16,7 @@ tracking=1
1616
7 8
1717
8 8
1818
9 8
19-
space 8
19+
space 3
2020
� 8
2121
A 8
2222
B 8
@@ -86,10 +86,11 @@ z 7
8686
Ć 5
8787
[ 3
8888
] 4
89-
, 8
89+
, 3
9090
= 5
9191
/ 6
9292
' 3
9393
( 3
9494
) 4
95+
% 6
9596

src/img/note_off.png

-76 Bytes
Loading

src/lists.lua

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
listviewContents = {}
44

55
listview = pd.ui.gridview.new(0, 10)
6-
listview.backgroundImage = gfx.image.new(10, 10, gfx.kColorWhite)
76
listview:setNumberOfRows(16)
87
listview:setCellPadding(0, 0, 5, 10)
9-
listview:setContentInset(24, 24, 13, 11)
8+
listview:setContentInset(20, 20, 10, 10)
109

1110
function listview:drawCell(section, row, column, selected, x, y, width, height)
1211
if selected then
@@ -26,10 +25,9 @@ end
2625
filePickListContents = {}
2726

2827
filePickList = pd.ui.gridview.new(0, 10)
29-
filePickList.backgroundImage = gfx.image.new(10, 10, gfx.kColorWhite)
3028
filePickList:setNumberOfRows(1)
3129
filePickList:setCellPadding(0, 0, 5, 10)
32-
filePickList:setContentInset(24, 24, 13, 11)
30+
filePickList:setContentInset(20, 20, 15, 10)
3331

3432
function filePickList:drawCell(section, row, column, selected, x, y, width, height)
3533
if filePickListContents[row] == ".." then
@@ -57,10 +55,9 @@ end
5755
settingsListContents = {}
5856

5957
settingsList = pd.ui.gridview.new(0, 10)
60-
settingsList.backgroundImage = gfx.image.new(10, 10, gfx.kColorWhite)
6158
settingsList:setNumberOfRows(1)
6259
settingsList:setCellPadding(0, 0, 5, 10)
63-
settingsList:setContentInset(24, 24, 13, 11)
60+
settingsList:setContentInset(20, 20, 15, 13)
6461

6562
function settingsList:drawCell(section, row, column, selected, x, y, width, height)
6663
if selected then

src/main.lua

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ function pd.update()
8686

8787
local crank = 0
8888
if crankMode == "tempo" then
89-
crank = pd.getCrankTicks(8)
89+
crank = pd.getCrankTicks(10)
9090
elseif crankMode == "turn knob" then
9191
crank = pd.getCrankTicks(8)
9292
else
@@ -214,7 +214,15 @@ function pd.update()
214214

215215
screenAnim(b)
216216
elseif crankMode == "tempo" then
217-
seq:setTempo(math.max(16, math.min(512, seq:getTempo() + (crank * 8))))
217+
local tm = getTempoFromSPS(seq:getTempo()) -- this is some goofy math but it works lol
218+
219+
if settings["smallerTempoIncrements"] then
220+
tm = getSPSfromTempo(tm + (crank / 1.25))
221+
else
222+
tm = getSPSfromTempo(tm + (crank * 8))
223+
end
224+
225+
seq:setTempo(math.max(16, math.min(512, tm)))
218226
sinetimer.duration = 400 - (getTempoFromSPS(seq:getTempo()) / 8)
219227
if seq:isPlaying() and settings["stopontempo"] then
220228
seq:stop()
@@ -337,6 +345,7 @@ function pd.update()
337345
local selRow = listview:getSelectedRow()
338346
if listviewContents[1] ~= "*Ā*" then
339347
if listview.needsDisplay or textTimer.timeLeft ~= 0 then
348+
gfx.clear()
340349
listview:drawInRect(0, 0, 400, 240)
341350

342351
if instrument.allMuted == true then
@@ -412,10 +421,9 @@ function pd.update()
412421
end
413422
gfx.drawTextInRect(toDraw .. " by " .. songAuthor, 0, 0, 400, 240, nil, nil, align.center)
414423

415-
gfx.drawTextAligned(curMet .. (getTempoFromSPS(seq:getTempo() / 8)), 400, 222, align.right)
424+
gfx.drawTextAligned(curMet .. (math.round(getTempoFromSPS(seq:getTempo() / 8), 2)), 400, 222, align.right)
416425
gfx.drawText(math.floor(stepCount / 8) .. " steps", 0, 222)
417426

418-
419427
if settings["visualizer"]["sine"] then -- sine wave
420428
gfx.setLineWidth(2)
421429
gfx.drawSineWave(0, 120, 405, 120, (stepCount / 2) / 8, (stepCount / 2) / 8,

src/pdxinfo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ name=CS-16
22
author=nanobot567
33
description=cranky synth 16: a 16-track synthesizer/sampler for playdate.
44
bundleID=com.nano.cs16
5-
version=2.0.3
6-
buildNumber=4625
5+
version=2.0.4
6+
buildNumber=4752
77
imagePath=SystemAssets/

src/save.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ function loadSave(name)
174174

175175
log.append("setting tempo to " .. tmp[2][1] .. "...")
176176

177-
seq:setTempo(tmp[2][1] * 8) -- TODO: be sure to implement real world bpm changes once fix is pushed!
177+
seq:setTempo(tmp[2][1] * 8)
178178
sinetimer.duration = 400 - (getTempoFromSPS(seq:getTempo()) / 8)
179179

180180
log.append("setting stepcount...")

0 commit comments

Comments
 (0)