VGM playback library for Common Lisp
Révision | 8c1a808329078555a46129a9506882b8a40b1042 (tree) |
---|---|
l'heure | 2023-08-18 19:06:44 |
Auteur | Remilia Scarlet <remilia@post...> |
Commiter | Remilia Scarlet |
Add a very simple example player.
@@ -0,0 +1,24 @@ | ||
1 | +(require 'cl-portaudio) | |
2 | +(require 'satou) | |
3 | + | |
4 | +(defun play-vgm (vgm) | |
5 | + (check-type vgm (or string pathname)) | |
6 | + | |
7 | + (let* ((vgm (satou:read-vgm-file vgm)) | |
8 | + (player (satou:make-vgm-player vgm)) | |
9 | + (left (sdm:new-array 2048 single-float 0.0)) | |
10 | + (right (sdm:new-array 2048 single-float 0.0)) | |
11 | + (buf (sdm:new-array 4096 single-float 0.0))) | |
12 | + (satou:vgm-player-play player) | |
13 | + (pa:with-audio | |
14 | + (pa:with-default-audio-stream (out 0 2 :frames-per-buffer 2048) | |
15 | + (loop do | |
16 | + (satou:vgm-player-render player left right) | |
17 | + (loop for idx fixnum from 0 below 4096 by 2 | |
18 | + for idx2 fixnum from 0 | |
19 | + for smp-left single-float = (aref left idx2) | |
20 | + for smp-right single-float = (aref right idx2) | |
21 | + do (setf (aref buf idx) smp-left) | |
22 | + (setf (aref buf (1+ idx)) smp-right)) | |
23 | + (pa:write-stream out buf))))) | |
24 | + nil) |