2018年10月28日

wxLuaApp 開発中:Love2D っぽく使えるようになった

 GitHub - wxLuaApp をぼちぼちと開発中。いろいろと忙しくてなかなか進まんけど、こんな感じになってます。

20181028-1.png

 コードの方は、wxmain.lua, Document.lua, Controller.lua の3ファイルを1つのフォルダに入れて、このフォルダを wxLuaApp のアプリケーションに Drag&Drop する。Love2D と同じようなスタイル。

-- wxmain.lua
require "Document"

function LuaApp.OpenDocument(file)
  local doc = Document.new(file)
end

function LuaApp.NewDocument()
  LuaApp.OpenDocument(nil)
end
-- Document.lua
require "Controller"

--  Class definition
Document = {}
Document.untitled_count = 0

function Document.new(filename)
  local doc = {}
  setmetatable(doc, { __index = Document } )
  local bname
  if filename == nil then
    bname = string.format("Untitled %d", Document.untitled_count)
    Document.untitled_count = Document.untitled_count + 1
  else
    bname = filename
  end
  doc.controller = Controller.new(doc, bname)
  return doc
end
-- Controller.lua
--  Class definition
Controller = {}

function Controller.new(doc, bname)
  local cont = {}
  setmetatable(cont, { __index = Controller } )
  cont.document = doc
  --  Create frame
  local frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxSize(640, 400))
  frame.controller = cont
  frame:SetTitle(bname)
  cont.frame = frame
  cont.scrollwin = wx.wxScrolledWindow(frame, wx.wxID_ANY)
  cont.scrollwin:SetScrollbars(1, 1, 640, 400)
  cont.panel = wx.wxPanel(cont.scrollwin, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxSize(640, 400))
  cont.panel:Connect(wx.wxEVT_PAINT, function (event) cont:OnPaint(event) end)
  frame:Show(true)
  return cont
end

function Controller.OnPaint(self, event)
  local dc = wx.wxPaintDC(self.panel)
  dc:DrawLine(0, 0, 640, 400)
  dc:delete()
end

 実際にコーディングしてみると、ピリオドとコロンの間違いでしょっちゅう引っかかる。これは Python や Ruby にはないストレス。要は「なんちゃってオブジェクト指向」の悲しさだな。「Lua の良さ」を引き出すには、「処理速度」と「組み込み向け」の特徴を生かさないといけない。つまり、重い処理を Lua で書いて、「C++ 使わなくてもここまでできるでしょ?」と見せつけるのと、単体のアプリをそこそこのサイズ(実行形式で 200 MB とかじゃなくて)で作ってみせること。

posted by toshinagata at 12:28| 日記

2018年10月14日

Mac のプレビューでブックレット印刷する (AirPrint)

 「LÖVE (Love2D) プログラミング」は、ブラウザから印刷できるようになっている。A4 1枚に2ページのレイアウトで、ブックレット印刷(中綴じ印刷)をすると、参照に便利です。Mac の「プレビュー」を使うやり方をメモしておく。なお、"AirPrint" 対応のプリンタが接続されていることが必要。

1. まず、ブラウザから普通にプリントダイアログを開く。

20181013-1.png

2. 「背景をプリント」にチェックを入れる(このチェックボックスが出ていない場合は、「詳細を表示」ボタンを押す)。左下の「PDF」メニューから「プレビューで PDF を開く」を選ぶ。

20181013-2.png

3. プレビューで PDF が開く。左側のサイドバーをサムネール表示にしておく(左上のボタンを押して、出てくるメニューから「サムネール」を選ぶ)。

20181013-3.png

4. このままプリントしてもいいのだけど、ブックレット印刷をすると、4ページの倍数に満たないときに空白ページができてしまうので、2つ以上の章を別々に印刷すると無駄が多い。そこで、いくつかの章をまとめて印刷する。上の 1.〜3. の操作を、連続した章に対して行って、プレビューで表示する。下の図では、8, 9, 10 章がプレビューで表示されている。

20181013-4.png

5. ここからは、PDF を連結する作業になる。まず、最初に開いた PDF のウィンドウを前面に出す。サイドバーで、最後のページを選ぶ。この PDF は4ページなので、4ページ目を選ぶ。

20181013-5.png

6. 次に、二番目に開いた PDF のウィンドウを前面に出す。サイドバーで、最初のページを選んだあと、「編集/すべてを選択」で、全部のページを選択する。

20181013-6.png

7. (ここが難しい)選択したページを、一番目の PDF の最後のページの直後にドラッグする。

20181013-7.png

8. 一番目の PDF の最後に、二番目の PDF の全ページが結合される。

20181013-8.png

9. 同じようにして第10章の PDF も結合する。全部で17ページの PDF になった。

20181013-9.png

10. 「ファイル/プリント」を選ぶ。プリンタとして "AirPrint" 系のものを選んでおく。

20181013-10.png

11. 「プレビュー」ポップアップメニューから、「レイアウト」を選ぶ。

20181013-11.png

12. 「両面」ポップアップメニューから「ブックレット」を選ぶ。これはたぶんプリンタドライバ依存の機能なので、同じプリンタを使っていても "AirPrint" ドライバでなければ出てこない場合がある(今回はここでハマった)。

20181013-12.png

13. 「ブックレット」を選ぶと、プレビューが変化するのだが、このままプリントすると「普通の両面印刷」になってしまいそうである。でも、実際にはちゃんと「重ねて二つ折りにする」とブックレットになるように印刷される。紛らわしい。(これは 10.11 付属のプレビューの場合なので、今は修正されているかも。)

20181013-13.png

 すごく面倒臭そうだけど、上の手順のうち半分ぐらいは「PDF を結合する」手順。単にブックレット印刷をするだけなら、「レイアウト」で「ブックレット」を選ぶだけで簡単にできる。標準機能だけでできるのは便利です。

タグ:Mac
posted by toshinagata at 00:18| 日記

2018年10月07日

Roland A-49 が macOS 10.13 で動かん

 ヒメが DTM に本格的に手を出そうとしている。だいぶ前から GarageBand は使っていて、学校の体育の時間に使うダンス音楽の編集などを(時には友人の分まで)やったりはしていた。この春に、MacBook Air (macOS 10.13) と Cubase, その他もろもろ一式を買って、さて始めようとしたわけですが。

 Roland の A-49 が動かん、という。え、普通の MIDI キーボードだろ? 何が問題なんだ? と思ったのだが、確かに動かん。

 まず、USB で Mac につないでも電源が入らない。これは、最初に Function-Assign-Pitch を押しながらケーブルを刺すと、電源が入ることがわかった。ちなみに Amazon レビューの情報。一度これで電源が入ると、次からは普通につないでも電源が入る。なんだかよくわからんが、一応これはクリアしたと考える。

 ところが、電源は入るのに、Mac が認識しない。試しに、自分の Mac (OS は 10.11) で試してみると、普通に認識した。ここから、犯人探しが始まった。システムログを見ても、どこで詰まっているのかよくわからない。A-49 の機能拡張は RDUSB0156Dev.kext だということはわかったので、手動で sudo kextload /Library/Extensions/RDUSB0156Dev.kext とやってみると、「システムポリシーのためにロードできませんでした」みたいなメッセージが出る。そうか、セキュリティ強化のための機能制限に引っかかってるのか。

 ネットで調べてみると、「リカバリーモードで立ち上げて csrutil disable とする」なんて解決策が出ている。これはアカンやつやろ、と思ったが、試しにやってみたところ、sudo kextload /Library/Extensions/RDUSB0156Dev.kext は通るようになった。手動でこれを実行しておけば、ちゃんと Audio MIDI 設定で A-49 が見えて、USB に接続すると認識される。

 一回やっておけば次からは自動認識されるんじゃない、と思ったのだが、甘かった。再起動すると、やはり sudo kextload /Library/Extensions/RDUSB0156Dev.kext からやらないとダメ。ヒメは「しょうがないね」と言いつつ、このコマンドをメモしていた。ここまでやらなきゃいけないなんて、どう考えてもおかしいだろう、と思うのだが、今のところこの方法しか見つかってない。Apple も Roland も、もうちょっとなんとかならんもんかな。セキュリティを強化するのは結構なんだけどさ。

 そもそも、たかが MIDI キーボードだろ? 本当に機能拡張なんて要るのか? USB の MIDI ストリーミングサブクラスじゃあかんのか? 疑問は尽きない。

タグ:音楽 DTM
posted by toshinagata at 21:19| 日記

2018年10月04日

調子に乗って wxLua

 Love2D (LÖVE) を使ったプログラミングがなかなか面白いので、調子に乗って wxLua なるものに手を出してしまった。

20181004-1.png

 上記の公式ウェブサイトは、2012 年で開発が止まっていて、wxWidgets 2.9 までしか対応していないように見える。しかし、公式じゃないが細々と開発を続けている人がいる。一番活発なのは Paul Kulchenko 氏。この人は、Lua 用の IDE として名高い ZeroBrane Studio の開発者である。Lua への本気度は信じるに値する。

 Love2D (LÖVE) では、単体のアプリにスクリプトを読ませることで、Lua プログラムを実行するようになっていた。同じように、wxWidgets の機能を一通り取り入れたアプリを作成して、それが Lua スクリプトを実行するようにしてみた。どれぐらい大きくなるか、と思ったのだが、Mac 64 ビットアプリで 23 MB。まあ許容範囲じゃない?

20181004-2.png

 さらに調子に乗って、Windows 版も作成してみた(32ビット版)。mingw32 のクロスコンパイラを使う。こちらは 60 MB。もしかしてシンボル情報とか残ったままだったかな。確認しなきゃ。

20181004-3.png

 なお、Windows を 32 ビット版にしたのは、64 ビット版だと EasyWine で動かないから。また、wxLua 本体の方も、sizeof(long) = sizeof(void *) が前提になっているコードがかなりあって、mingw64 のクロスコンパイラ(long は 32 ビット、void * は 64 ビット)に対応するには修正が必要、というのもある。

 Windows 32 ビット版のアプリを EasyWine で動かしてみた。ビルドからテスト実行まで Mac 上で完結するのは嬉しい。

20181004-4.png

 プロジェクトはこちらです:GitHub - wxLuaApp。Xcode 上で自分でビルドすることしか考えてないので、Mac 以外のプラットフォームでビルドするのは面倒です。まあ、ぼちぼち進めていきます。

posted by toshinagata at 23:46| 日記
email.png
Powered by さくらのブログ