

現在、以下のPDFを参考にゲームを作っております。  
<http://www.usamimi.info/~ide/programe/stg_doc/stg-commonlisp.pdf>

上記PDFではサウンド周りのことは自分で調べて実装するように記載されているため、ひとまずlispbuilder-sdl-mixer-
examplesを実行して動作を確認しようと思ったのですが、以下のようなエラーがでて上手く実行されません。

> $ sbcl --load mixer.lisp  
>  This is SBCL 1.3.10, an implementation of ANSI Common Lisp.  
>  More information about SBCL is available at <http://www.sbcl.org/>.
>
> ※長くなるため、正常時でもでてくる部分は省略します。  
>  ～～省略～～  
>  ※quicklispのログも一部省略します。  
>  To load "cffi":  
>  To load "alexandria":  
>  To load "babel":  
>  To load "cl-autowrap":  
>  To load "cl-ppcre":  
>  To load "trivial-garbage":  
>  To load "cl-opengl":  
>  To load "lispbuilder-sdl":  
>  To load "lispbuilder-sdl-mixer":  
>  To load "lispbuilder-sdl-mixer-examples":
>
> While evaluating the form starting at line 43, column 0  
>  of #P"C:/cygwin64/home/■■■■■/work/SDL/mixer.lisp":
>
> debugger invoked on a BABEL-ENCODINGS:INVALID-UTF8-STARTER-BYTE in thread
>
> # :
>
> Illegal :UTF-8 character starting at position 26.
>
> Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
>
> restarts (invokable by number or by possibly-abbreviated name):  
>  0: [RETRY ] Retry EVAL of current toplevel form.  
>  1: [CONTINUE] Ignore error and continue loading file
> >"C:\cygwin64\home\■■■■■\work\SDL\mixer.lisp".  
>  2: [ABORT ] Abort loading file
> >"C:\cygwin64\home\■■■■\work\SDL\mixer.lisp".  
>  3: Ignore runtime option --load "mixer.lisp".  
>  4: Skip rest of --eval and --load options.  
>  5: Skip to toplevel READ/EVAL/PRINT loop.  
>  6: [EXIT ] Exit SBCL (calling #'EXIT, killing the process).
>
> ((LABELS BABEL-ENCODINGS::UTF-8-DECODER :IN
> >"C:/cygwin64/home/■■■■■/work/SDL/./quicklisp/dists/quicklisp/software/cffi_0.>17.1/src/strings.lisp")
> #)

コードは以下の内容となっています。

mixer.lisp

[code]

    ; setting encode        
    (setf sb-impl::*default-external-format* :utf-8)
    (setf sb-alien::*default-c-string-external-format* :utf-8)
    
    ; quicklisp initialize
    (let ((quicklisp-init "./quicklisp/setup.lisp"))
        (when (probe-file quicklisp-init)
            (load quicklisp-init)))
    
    (ql:quickload :cffi)
    (mapcar #'(lambda (path) 
                (pushnew path cffi:*foreign-library-directories*
                                  :test #'equal))
            '("./FrameWorks/"))
    (ql:quickload :alexandria)
    (ql:quickload :babel)
    (ql:quickload :cl-autowrap)
    (ql:quickload :cl-ppcre)
    (ql:quickload :trivial-garbage)
    (ql:quickload :cl-opengl)
    (ql:quickload :lispbuilder-sdl)
    (ql:quickload :lispbuilder-sdl-mixer)
    
    (defun mixer-test ()
        (sdl:with-init (sdl:sdl-init-video sdl:sdl-init-audio)
            (sdl:window 50 10)
    
            (sdl-mixer:OPEN-AUDIO)
                (let ((music (sdl-mixer:load-music "konjaku.mp3")))
                    (sdl-mixer:play-music music :loop t)
    
                    (sdl:with-events ()
                        (:quit-event ()
                                        (sdl-mixer:Halt-Music)
                                        (sdl-mixer:free music)
                                        (sdl-mixer:close-audio)
                                        t)
                        (:idle () (sdl:update-display))))))
    
    ;(mixer-test)
    
    (ql:quickload :lispbuilder-sdl-mixer-examples)
    (sdl-mixer-examples:mixer)
    (quit)
    
[/code]

ファイル構成は以下です。

> work/SDL  
>  |-Frameworks  
>  |-SDL.dll  
>  |-SDL_image.dll  
>  |-SDL_mixer.dll  
>  |-quicklisp  
>  |-※書ききれないため省略  
>  |-konjaku.mp3  
>  |-mixer.lisp

エンコード関係で不正なコードになっているようですが、どこが不正なのかわからず困っております。  
前処理あたりに問題があるのでしょうか？(コールする前に必須の処理がある？）  
なお、mixer-test関数(ネットから拾ってきたコードそのままです)に関しても同様のエラーがでます。  
mixer-testのprintデバッグでは

[code]

                (let ((music (sdl-mixer:load-music "konjaku.mp3")))
    
[/code]

あたりに問題があるようでした。  
原因がわからず困っております。どのように解決すればよろしいでしょうか。

\--追記--  
"konjaku.mp3"ですが、Mp3tagというソフトで調べたところ"UTF-8"となっていました。念のため、UTF-8で書き込みしたものを別に用意して使用してみましたが、同じエラーになりました。

ログ中の伏字■■■■■についてですが、英字のみしか使用しておりません。

使用しているOSの情報は以下です。

> Windows 10 Home 64Bit

文字コードがUTF-8になっていないことが原因とのことでしたので、以下のことを実行してみましたが、同じエラーがでてくるだけでした。

> $nkf -w --overwrite mixer.lisp  
>  $nkf -guess mixer.lisp  
>  ASCII  
>  $sbcl --load mixer.lisp  
>  While evaluating the form starting at line 18, column 0  
>  of #P"C:/cygwin64/home/■■■■■/work/SDL/mixer.lisp":
>
> debugger invoked on a BABEL-ENCODINGS:INVALID-UTF8-STARTER-BYTE in thread
>
> # :
>
> Illegal :UTF-8 character starting at position 26.
>
> Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
>
> restarts (invokable by number or by possibly-abbreviated name):  
>  0: [RETRY ] Retry EVAL of current toplevel form.  
>  1: [CONTINUE] Ignore error and continue loading file
> "C:\cygwin64\home\■■■■■\work\SDL\mixer.lisp".  
>  2: [ABORT ] Abort loading file
> "C:\cygwin64\home\■■■■■\work\SDL\mixer.lisp".  
>  3: Ignore runtime option --load "mixer.lisp".  
>  4: Skip rest of --eval and --load options.  
>  5: Skip to toplevel READ/EVAL/PRINT loop.  
>  6: [EXIT ] Exit SBCL (calling #'EXIT, killing the process).
>
> ((LABELS BABEL-ENCODINGS::UTF-8-DECODER :IN
> "C:/cygwin64/home/■■■■■/work/SDL/./quicklisp/dists/quicklisp/software/cffi_0.17.1/src/strings.lisp")
> #)

また、REPL上で"quickload"、":cffi"、":lispbuilder-sdl-
mixer"を読み込み、続いて以下のコードを実行してみましたが、同じエラーがでるだけでした。

> (sdl-mixer:load-music  
>  (merge-pathnames  
>  "examples/music.mp3"  
>  (asdf:system-source-directory :lispbuilder-sdl-mixer)))

lispbuilder-sdl-
mixerのexamplesでさえ実行できないとなると、もっと根本的なところで問題があるのでしょうか？(皆目見当も付きませんが、、、)


CC BY-SA 3.0
2016-10-23T00:12:18.343
29821
2016-10-24T16:25:36.287
2016-10-24T16:25:36.287
19279
19279
question
common-lisp lisp
Lispbuilder-sdlで音楽を鳴らしたいのですが、"BABEL-ENCODINGS:INVALID-UTF8-STARTER-BYTE"というエラーがでて実行できません。


エラーの内容だけみるとファイルをUTF-8で読んだ場合に不正となる文字がある、ということのようです。  
この場合考えられるのは、

  1. mixer.lisp はUTF-8で保存されているが、不正が文字が含まれている
  2. mixer.lisp がSJIS等で保存されているので、UTF-8として読むと不正になる

ということが多いかと思います。

  1. UTF-8で保存されているかどうか確認する
  2. mixer.lisp に含まれるASCII以外の文字を無くしてみる

等を試してみてはいかがでしょうか。

パスなどに日本語が含まれることが多いと思いますので、REPL上で

[code]

    (sdl-mixer:load-music 
     (merge-pathnames
      "examples/music.mp3"
      (asdf:system-source-directory :lispbuilder-sdl-mixer)))
    
[/code]

等、日本語が含まれないパスで実験してみるのも有効かと思います  
(上記コードは開いているデバッガに入力して評価し確認することができると思います。)


CC BY-SA 3.0
2016-10-23T13:02:53.963
29837
2016-10-23T13:02:53.963
3510
29821
answer