[CM] SDIF/lisp question

Ralf Mattes rm at seid-online.de
Wed Apr 2 08:45:40 PDT 2008


On Wed, 2008-04-02 at 12:15 -0300, padovani wrote:
> Hi...
> I'm trying to deal with sdif files with common lisp functions and, as 
> composer who tries to deal with code, I have a question that migth be 
> stupid...
> 
> The file that I want to deal begins with these HEX (SDIF  header), that 
> I could read with a standard Hex editor:
> 
> 53 44 49 46 00 00 00 08  00 00 00 03 00 00 00 01
> 31 4e 56 54 00 00 00 78  ff ef ff ff ff ff ff ff
> 00 00 00 00 00 00 00 01  31 4e 56 54 00 00 03 01
> 00 00 00 57 00 00 00 01  .....
> 
> So, I tried to open it on a stream
> 
>     (setq in-stream (open "mongombi.trc.sdif" :direction :input))
> 
> worked.
> Then I tried to spell the bytes...
> 
>     (read-byte in-stream)
> 
> and read the bytes... And got:
>    
>  >>> Error: #<SB-SYS:FD-STREAM for "file 
> /Users/ze/Documents/documentos/meus/codigos/grace/sdifnovo/mongombi.trc.sdif" 
> {12B08011}> is not a binary input stream.
> 
> so I tried with (read-char ...) as the first bytes represent "SDIF" 
> chars and then I could spell the first 24 bytes:
> 
>     (read-char in-stream)
> #\S
> #\D
> #\I
> #\F
> #\Nul
> #\Nul
> #\Nul
> #\Backspace
> #\Nul
> #\Nul
> #\Nul
> #\Etx
> #\Nul
> #\Nul
> #\Nul
> #\Soh
> #\1
> #\N
> #\V
> #\T
> #\Nul
> #\Nul
> #\Nul
> #\x
> 
> But when I try to spell the 25th byte, I get:
>  >>> Error: decoding error on stream
>            #<SB-SYS:FD-STREAM for "file 
> /Users/ze/Documents/documentos/meus/codigos/grace/sdifnovo/mongombi.trc.sdif" 
> {116A67B1}>
>            (:EXTERNAL-FORMAT :UTF-8):
>              the octet sequence (255 239 255 255) cannot be decoded.
> 
> This is the "ff ef ff ff ff ff ff ff" part of the HEX transcription of 
> the file...
> It seems I'm not getting something related to streams, but really can't 
> understand...
> 
> If anyone can give some ligth sbout how to deal with this on common-lisp 
> or how to use the sdif library in common lisp it wold be really nice...
> Thanks,

You need to fresh up your LISP: streams have an associated element-type.
If you want/need to read bytes you need to open the file as follows:

 (setq in-stream (open "mongombi.trc.sdif" 
                       :direction :input
                        :element-type 'unsigned-byte))

Then 'read-byte' should work. If you don't specify the element type it
will default to character or base-character. As a result your Lisp of
choice will try to read characters in the default external format
(another possible keyword parameter to open), which in your case seems
to be utf-8 (which is _not_ a single byte encoding!). This will fail as
soon as the file contains an invalid utf-8 byte sequence.

HTH  Ralf Mattes

P.S.: I strongly suggest using 'with-open-file' instead of direct
'open/close' calls.

> 
> José H. Padovani
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> _______________________________________________
> Cmdist mailing list
> Cmdist at ccrma.stanford.edu
> http://ccrma-mail.stanford.edu/mailman/listinfo/cmdist




More information about the Cmdist mailing list