
Chirps from ten species of crickets were analyzed in terms of rhythm and dominant frequency to determine characteristics of constituent wavelets from each species' chirp. This data was translated into assembly language instructions to make an algorithm that synthesizes chirps. Each cricket contains a microcontroller running at 4 MHz, programmed with a virtual 2-bit square wave oscillator that interprets data from each chirp. As the crickets chirp, calls of different species cycle with varying length, making a multi-species chorus as the calls overlap. The negligible differences between the microcontrollers' on-board clocks were exploited to cause relative phasing amongst the chirps.
To keep body size small the printed circuit board was made as narrow as possible with few components. The crickets are made of masonite, monokote, paint, and electronic components.
Crickets has been installed at the Weisman Art Gallery in Minneapolis, REDCAT in Los Angeles, and at California Institute of the Arts.
Gallery
Spectrograms

crickets.asm
1:;=========================================;
2:; Crickets - 2005 Cooper Baker ;
3:;=========================================;
4:
5:; INIT ============================================================
6: device sx28l,osc4mhz
7: device turbo,stackx,optionx
8: IRC_CAL irc_slow ;irc_4mhz
9: reset main
10: freq 4000000
11:
12:; DATA =======================================================
13:
14: ;================================
15: org $008 ; memory page
16: ;================================
17:
18:oscil_count ds 1
19:oscil_loops ds 1
20:cycle_count ds 1
21:cycle_loops ds 1
22:seconds ds 2
23:wait ds 3
24:rand ds 1
25:address ds 1
26:wavelets ds 1
27:rubs ds 1
28:chirps ds 1
29:
30:watch rand,8,udec
31:watch chirps,8,udec
32:watch seconds,8,udec
33:
34:; constants --------------------------------------------------
35:leds equ ra
36:pins equ rb
37:oscpin equ rb.0
38:loud equ %11111110
39:medi equ %11111100
40:soft equ %11110000
41:rest equ %11111111
42:
43: ;================================
44: org $000 ; memory page
45: ;================================
46:
47:; SYNTHESIS ===================================================
48:
49:counter ;----------------------------------------------------
50: mov oscil_count,oscil_loops ; + 2
51::loop nop ; * 1
52: nop ; * 1
53: nop ; * 1
54: nop ; * 1
55: djnz oscil_count,:loop ; * 4 + 2 =
56: retp ; * 8 + 4 total
57:
58:oscil ;-----------------------------------------------------------
59: clrb oscpin
60: call @counter
61: setb oscpin
62: call @counter
63: retp
64:
65:cycle ;-----------------------------------------------------------
66: mov cycle_count,cycle_loops
67::loop call @oscil
68: djnz cycle_count,:loop
69: retp
70:
71:
72:; TIMING =======================================================
73:
74:waiter ;----------------------------------------------------------
75::loop mov wait+2,#16 ; + 2 | 4 = 34
76::loop_c mov wait+1,#249 ; * 2 | 249 = 1496
77::loop_b mov wait,#249 ; * 2 | 249 = 998
78::loop_a djnz wait,:loop_a ; * 4 + 2 | wait_a * 4 + 2 = a = 998
79: djnz wait+1,:loop_b ; * 4 + 2 | wait_b * 6 + 2 + (a * wait_b) = b = 249998
80: djnz wait+2,:loop_c ; * 4 + 2 | wait_c * 8 + 2 + (b * wait_c) = c = 1000026
81: djnz seconds,:loop ; countdown (unrelated to clocking)
82: retp ; + 3
83: ; c + 5 = | 4,000,098 total clocks (~1 second)
84:
85:random_chirps ;----------------------------------------------------------
86: mov W,<<rand
87: mov W,<<rand
88: snb rand.4
89: xor W,#1
90: snb rand.5
91: xor W,#1
92: snb rand.3
93: xor W,#1
94: mov rand,W
95: mov chirps,W
96: clc
97: rr chirps ; rand scaling by shifting
98: clc
99: rr chirps
100: clc
101: rr chirps
102: clc
103: rr chirps
104: add chirps,#1
105: ret
106:
107:random_waits ;----------------------------------------------------------
108: mov W,<<rand
109: mov W,<<rand
110: snb rand.4
111: xor W,#1
112: snb rand.5
113: xor W,#1
114: snb rand.3
115: xor W,#1
116: mov rand,W
117: mov seconds,W
118: clc
119: rr seconds ; rand scaling by shifting
120: clc
121: rr seconds
122: clc
123: rr seconds
124: clc
125: rr seconds
126: add seconds,#1
127: ret
128:
129:; MAIN ============================================================
130:main mov !leds,#0
131: mov rand,#$a0
132:loop
133: call random_chirps
134: call @badlands
135: call random_waits
136: call waiter
137:
138: call random_chirps
139: call @banded_scaly
140: call random_waits
141: call waiter
142:
143: call random_chirps
144: call @black_faced_bush
145: call random_waits
146: call waiter
147:
148: call random_chirps
149: call @carolina_ground
150: call random_waits
151: call waiter
152:
153: call random_chirps
154: call @common_short_tailed
155: call random_waits
156: call waiter
157:
158: call random_chirps
159: call @confused_ground
160: call random_waits
161: call waiter
162:
163: call random_chirps
164: call @damp_loving_field
165: call random_waits
166: call waiter
167:
168: call random_chirps
169: call @fall_field
170: call random_waits
171: call waiter
172:
173: jmp loop
174:
175:; CHIRP SUBROUTINES ==============================================
176:
177: ;================================
178: org $200 ; memory page
179: ;================================
180:
181:; JUMPS ** ** **
182:confused_ground
183: jmp confused_ground_jump
184:; ** ** ** ** **
185:
186:
187:badlands ;- 400 ms ---------------------------------------------
188: mov oscil_loops,#56 ; 4.4 kHz
189::chirp
190: mov wavelets,#5 ; 5 wavelets
191::wavelet
192: mov !pins,#soft ; soft
193: mov cycle_loops,#4 ; 1 ms
194: call @cycle ;
195:
196: mov !pins,#medi ; medi
197: mov cycle_loops,#4 ; 1 ms
198: call @cycle ;
199:
200: mov !pins,#loud ; loud
201: mov cycle_loops,#22 ; 5 ms
202: not leds ; leds on
203: call @cycle ;
204: not leds ; leds off
205:
206: mov !pins,#medi ; medi
207: mov cycle_loops,#26 ; 6 ms
208: call @cycle ;
209:
210: mov !pins,#soft ; soft
211: mov cycle_loops,#22 ; 5 ms
212: call @cycle ;
213:
214: djnz wavelets,:wavelet ; wavelet loop
215:
216: mov wavelets,#10 ; 310 ms
217: mov !pins,#rest ; rest
218: mov cycle_loops,#136 ; 31 ms
219::pause call @cycle ;
220: djnz wavelets,:pause ; pause loop
221: djnz chirps,:chirp ; chirp loop
222: retp
223:
224:banded_scaly ;- 100 ms + 2 sec pause --------------------------------
225: mov oscil_loops,#37 ; 6.6 kHz
226::chirp
227: mov wavelets,#11 ; 11 wavelets
228::wavelet
229: mov !pins,#soft ; soft
230: mov cycle_loops,#20 ; 3 ms
231: call @cycle ;
232:
233: mov !pins,#medi ; medi
234: mov cycle_loops,#13 ; 2 ms
235: call @cycle ;
236:
237: mov !pins,#loud ; loud
238: mov cycle_loops,#99 ; 15 ms
239: not leds ; leds on
240: call @cycle ;
241: not leds ; leds off
242:
243: mov !pins,#medi ; medi
244: mov cycle_loops,#7 ; 1 ms
245: call @cycle ;
246:
247: mov !pins,#soft ; soft
248: mov cycle_loops,#26 ; 4 ms
249: call @cycle ;
250:
251: mov !pins,#rest ; rest
252: mov cycle_loops,#165 ; 25 ms
253: call @cycle ;
254: mov cycle_loops,#165 ; 25 ms
255: call @cycle ;
256: mov cycle_loops,#165 ; 25 ms
257: call @cycle ;
258:
259: djnz wavelets,:wavelet ; wavelet loop
260:
261: mov wavelets,#193 ; 1930 ms
262: mov !pins,#rest ; rest
263: mov cycle_loops,#66 ; 10 ms
264::pause call @cycle ;
265: djnz wavelets,:pause ; pause loop
266: djnz chirps,:chirp ; chirp loop
267: retp
268:
269:black_faced_bush ;- 100 ms + 1 sec pause --------------------------------
270: mov oscil_loops,#52 ; 4.8 kHz
271::chirp
272: mov wavelets,#11 ; 11 wavelets
273::wavelet
274: mov rubs,#2
275::rub
276: mov !pins,#soft ; soft
277: mov cycle_loops,#14 ; 3 ms
278: call @cycle ;
279:
280: mov !pins,#medi ; medi
281: mov cycle_loops,#14 ; 3 ms
282: call @cycle ;
283:
284: mov !pins,#loud ; loud
285: mov cycle_loops,#34 ; 7 ms
286: not leds ; leds on
287: call @cycle ;
288: not leds ; leds off
289:
290: mov !pins,#medi ; medi
291: mov cycle_loops,#29 ; 6 ms
292: call @cycle ;
293:
294: mov !pins,#soft ; soft
295: mov cycle_loops,#29 ; 6 ms
296: call @cycle ;
297:
298: djnz rubs,:rub ; rub loop
299:
300: mov !pins,#rest ; rest
301: mov cycle_loops,#239 ; 50 ms
302: call @cycle ;
303:
304: djnz wavelets,:wavelet ; wavelet loop
305:
306: mov wavelets,#19 ; 950 ms
307: mov !pins,#rest ; rest
308: mov cycle_loops,#239 ; 50 ms
309::pause call @cycle ;
310:
311: djnz wavelets,:pause ; pause loop
312: djnz chirps,:chirp ; chirp loop
313: retp
314:
315:carolina_ground ;- continuous (396 ms loop) ---------------------------------------------
316: mov oscil_loops,#40 ; 6.1 kHz
317::chirp
318: mov wavelets,#6 ; 6 wavelets
319::wavelet
320: mov !pins,#soft ; soft
321: mov cycle_loops,#43 ; 7 ms
322: not leds ; leds on
323: call @cycle ;
324: not leds ; leds off
325:
326: mov !pins,#rest ; rest
327: mov cycle_loops,#24 ; 4 ms
328: call @cycle ;
329:
330: mov !pins,#medi ; medi
331: mov cycle_loops,#43 ; 7 ms
332: not leds ; leds on
333: call @cycle ;
334: not leds ; leds off
335:
336: mov !pins,#rest ; rest
337: mov cycle_loops,#24 ; 4 ms
338: call @cycle ;
339:
340: mov rubs,#3
341::rub
342: mov !pins,#loud ; loud
343: mov cycle_loops,#43 ; 7 ms
344: not leds ; leds on
345: call @cycle ;
346: not leds ; leds off
347:
348: mov !pins,#rest ; rest
349: mov cycle_loops,#24 ; 4 ms
350: call @cycle ;
351:
352: djnz rubs,:rub ; rub loop
353: djnz wavelets,:wavelet ; wavelet loop
354:
355: mov !pins,#rest ; rest
356: djnz chirps,:chirp ; chirp loop
357: retp
358:
359:common_short_tailed ;- continuous (494 ms loop) ---------------------------------------------
360: mov oscil_loops,#44 ; 5.6 kHz
361::chirp
362: mov wavelets,#38 ; 38 wavelets
363::wavelet
364: mov !pins,#soft ; soft
365: mov cycle_loops,#6 ; 1 ms
366: call @cycle ;
367:
368: mov !pins,#medi ; medi
369: mov cycle_loops,#6 ; 1 ms
370: call @cycle ;
371:
372: mov !pins,#loud ; loud
373: mov cycle_loops,#17 ; 3 ms
374: not leds ; leds on
375: call @cycle ;
376: not leds ; leds off
377:
378: mov !pins,#medi ; medi
379: mov cycle_loops,#6 ; 1 ms
380: call @cycle ;
381:
382: mov !pins,#soft ; soft
383: mov cycle_loops,#11 ; 2 ms
384: call @cycle
385:
386: mov !pins,#rest ; rest
387: mov cycle_loops,#24 ; 4 ms
388: call @cycle ;
389:
390: djnz wavelets,:wavelet ; wavelet loop
391:
392: mov !pins,#rest ; rest
393: djnz chirps,:chirp ; chirp loop
394: retp
395:
396:confused_ground_jump ;- continuous (396 ms loop) ---------------------------------------------
397: mov oscil_loops,#36 ; 6.9 kHz
398:
399::chirp mov rubs,#6 ; 6 rubs
400:
401::rub_a mov !pins,#soft ; soft
402: mov cycle_loops,#62 ; 9 ms
403: not leds ; leds on
404: call @cycle ;
405: not leds ; leds off
406:
407: mov !pins,#rest ; rest
408: mov cycle_loops,#35 ; 5 ms
409: call @cycle ;
410: djnz rubs,:rub_a ; rub_a loop
411:
412: mov rubs,#6 ; 6 rubs
413::rub_b mov !pins,#soft ; soft
414: mov cycle_loops,#14 ; 2 ms
415: not leds ; leds on
416: call @cycle ;
417:
418: mov !pins,#medi ; medi
419: mov cycle_loops,#35 ; 5 ms
420: call @cycle ;
421:
422: mov !pins,#soft ; soft
423: mov cycle_loops,#14 ; 2 ms
424: not leds ; leds on
425: call @cycle ;
426:
427: mov !pins,#rest ; rest
428: mov cycle_loops,#35 ; 5 ms
429: call @cycle ;
430: djnz rubs,:rub_b ; rub_b loop
431:
432: mov rubs,#24 ; 24 rubs
433::rub_c mov !pins,#soft ; soft
434: mov cycle_loops,#7 ; 1 ms
435: not leds ; leds on
436: call @cycle ;
437:
438: mov !pins,#medi ; medi
439: mov cycle_loops,#7 ; 1 ms
440: call @cycle ;
441:
442: mov !pins,#loud ; loud
443: mov cycle_loops,#28 ; 4 ms
444: call @cycle ;
445:
446: mov !pins,#medi ; medi
447: mov cycle_loops,#7 ; 1 ms
448: call @cycle ;
449:
450: mov !pins,#soft ; soft
451: mov cycle_loops,#14 ; 2 ms
452: call @cycle ;
453: not leds ; leds off
454:
455: mov !pins,#rest ; rest
456: mov cycle_loops,#35 ; 5 ms
457: call @cycle ;
458: djnz rubs,:rub_c ; rub_c loop
459:
460: mov wavelets,#2 ; 2 wavelets
461:
462::wavelet
463: mov rubs,#3 ; 3 rubs (100 ms)
464:
465::rub_d mov !pins,#rest ; rest
466: mov cycle_loops,#228 ; 33 ms
467: call @cycle ;
468: djnz rubs,:rub_d ; rub_d loop
469:
470: mov rubs,#5 ; 5 rubs
471::rub_e mov !pins,#soft ; soft
472: mov cycle_loops,#62 ; 9 ms
473: not leds ; leds on
474: call @cycle ;
475: not leds ; leds off
476:
477: mov !pins,#rest ; rest
478: mov cycle_loops,#35 ; 5 ms
479: call @cycle ;
480: djnz rubs,:rub_e ; rub_e loop
481:
482: djnz wavelets,:wavelet ; wavelet loop
483:
484: mov rubs,#12 ; 12 rubs (400 ms)
485::rub_f mov !pins,#rest ; rest
486: mov cycle_loops,#228 ; 33 ms
487: call @cycle ;
488: djnz rubs,:rub_f ; rub_f loop
489:
490: mov rubs,#5
491::rub_g mov !pins,#soft ; soft
492: mov cycle_loops,#62 ; 9 ms
493: not leds ; leds on
494: call @cycle ;
495: not leds ; leds off
496:
497: mov !pins,#rest ; rest
498: mov cycle_loops,#35 ; 5 ms
499: call @cycle ;
500: djnz rubs,:rub_g ; rub_g loop
501:
502: mov rubs,#3 ; 3 rubs (100 ms)
503::rub_h mov !pins,#rest ; rest
504: mov cycle_loops,#228 ; 33 ms
505: call @cycle ;
506: djnz rubs,:rub_h ; rub_h loop
507:
508: mov !pins,#rest ; rest
509: djnz chirps,:chirp ; chirp loop
510: retp
511:
512: ;================================
513: org $400 ; memory page
514: ;================================
515:
516:damp_loving_field ;- 400 ms ---------------------------------------------
517: mov oscil_loops,#56 ; 4.4 kHz
518::chirp
519: mov wavelets,#2 ; 2 wavelets
520::wavelet
521: mov !pins,#soft ; soft
522: mov cycle_loops,#35 ; 8 ms
523: not leds ; leds on
524: call @cycle ;
525: not leds ; leds off
526:
527: mov !pins,#rest ; rest
528: mov cycle_loops,#35 ; 8 ms
529: call @cycle ;
530:
531: mov !pins,#soft ; soft
532: mov cycle_loops,#9 ; 2 ms
533: call @cycle
534:
535: mov !pins,#medi ; medi
536: mov cycle_loops,#9 ; 2 ms
537: call @cycle
538:
539: mov !pins,#loud ; loud
540: mov cycle_loops,#35 ; 8 ms
541: not leds ; leds on
542: call @cycle ;
543: not leds ; leds off
544:
545: mov !pins,#medi ; medi
546: mov cycle_loops,#9 ; 2 ms
547: call @cycle ;
548:
549: mov !pins,#soft ; soft
550: mov cycle_loops,#31 ; 7 ms
551: call @cycle ;
552:
553: mov !pins,#medi ; medi
554: mov cycle_loops,#9 ; 4 ms
555: call @cycle
556:
557: mov !pins,#loud ; loud
558: mov cycle_loops,#35 ; 3 ms
559: not leds ; leds on
560: call @cycle ;
561: not leds ; leds off
562:
563: mov !pins,#medi ; medi
564: mov cycle_loops,#9 ; 6 ms
565: call @cycle ;
566:
567: mov !pins,#soft ; soft
568: mov cycle_loops,#132 ; 30 ms
569: call @cycle ;
570:
571: mov rubs,#11 ; 110 ms
572: mov !pins,#rest ; rest
573: mov cycle_loops,#44 ; 10 ms
574:
575::pause call @cycle ;
576: djnz rubs,:pause ; pause loop
577: djnz wavelets,:wavelet ; wavelet loop
578: djnz chirps,:chirp ; chirp loop
579: retp
580:
581:
582:fall_field ;- 800 ms ---------------------------------------------
583: mov oscil_loops,#53 ; 4.7 kHz
584::chirp
585: mov wavelets,#2
586::head
587: mov !pins,#soft ; soft
588: mov cycle_loops,#71 ; 15 ms
589: not leds ; leds on
590: call @cycle ;
591: not leds ; leds off
592:
593: mov !pins,#rest ; rest
594: mov cycle_loops,#71 ; 15 ms
595: call @cycle
596:
597: djnz wavelets,:head ; head loop
598:
599: mov !pins,#soft ; soft
600: mov cycle_loops,#47 ; 10 ms
601: call @cycle
602:
603: mov !pins,#medi ; medi
604: mov cycle_loops,#47 ; 10 ms
605: not leds ; leds on
606: call @cycle ;
607: not leds ; leds off
608:
609: mov !pins,#soft ; soft
610: mov cycle_loops,#47 ; 10 ms
611: call @cycle
612:
613: mov !pins,#rest ; rest
614: mov cycle_loops,#71 ; 15 ms
615: call @cycle
616:
617: mov wavelets,#2 ; 2 wavelets
618::wavelet
619: mov !pins,#soft ; soft
620: mov cycle_loops,#24 ; 5 ms
621: call @cycle ;
622:
623: mov !pins,#medi ; medi
624: mov cycle_loops,#24 ; 5 ms
625: call @cycle ;
626:
627: mov !pins,#loud ; loud
628: mov cycle_loops,#47 ; 10 ms
629: not leds ; leds on
630: call @cycle ;
631: not leds ; leds off
632:
633: mov !pins,#medi ; medi
634: mov cycle_loops,#24 ; 5 ms
635: call @cycle ;
636:
637: mov !pins,#soft ; soft
638: mov cycle_loops,#24 ; 5 ms
639: call @cycle ;
640:
641: mov !pins,#rest ; rest
642: mov cycle_loops,#71 ; 15 ms
643: call @cycle
644:
645: djnz wavelets,:wavelet ; wavelet loop
646:
647: mov wavelets,#12 ; 600 ms
648: mov !pins,#rest ; rest
649: mov cycle_loops,#235 ; 50 ms
650::pause call @cycle ;
651: djnz wavelets,:pause ; pause loop
652: djnz chirps,:chirp ; chirp loop
653: retp
[