マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

kotlinでFile API ドラッグ&ドロップ編

kotlinでFile APIで遊んでるソースコード。ファイルがドロップされたらブラウザのconsoleにファイル名が表示されるはず…。JavaScriptにも変換できるならWebGLだって…めんどくさそう

import kotlin.browser.document
import org.w3c.dom.HTMLDivElement
import org.w3c.dom.DragEvent
import org.w3c.dom.asList

fun main(args: Array<String>) {
    val dropZone = document.createElement("div") as HTMLDivElement;

    dropZone.addEventListener("dragover", { e -> drag(e as DragEvent) }, false)
    dropZone.addEventListener("drop", { e -> drop(e as DragEvent) }, false)

    dropZone.style.width = "600px"
    dropZone.style.height = "600px"

    document.body!!.appendChild(dropZone)
}

fun drop(event: DragEvent) {
    event.stopPropagation()
    event.preventDefault()

    event.dataTransfer!!.files.asList().forEach{ println(it.name) }
}

fun drag(event: DragEvent) {
    event.stopPropagation()
    event.preventDefault()
}

新曲は2番までできています

今回は私の曲では初となるマイナーキーの曲です。部分的にマイナーなのはありますが、全体を通してマイナーというのは多分今まで一度も作ったことが無いはずです。今まで35(+α)曲作っていたが、ずっとメジャーキーでした。なので明るい曲が多かったです。個人的には去年の曲の印象が強く、特に元気のでるような雰囲気が多かったかなぁと。ただ、今回はマイナーキーで暗い感じです。同じコードがひたすら続いたり中二感の強いバッキングが特徴となっているかと。曲が暗めの雰囲気でボカロはどうしようか悩んでいましたが、これらの発言によりIAに決定しました

新曲『黄色いハンカチ』

第3回Ranaコンピ Ranairo Raibow Octet 収録曲(トラック03)
はい、ボーマスやコミケでもしかしたら頒布されるかもしれない
アルバムRanairo Raibow Octetの中の1曲を担当させていただきました。
アルバム全体のテーマが虹色で、それぞれの曲が7色のどれかの色をテーマとしています。最後に全体をテーマとした1曲もあり、全8曲という構成です。

とりあえず黄色をテーマとした自分の曲を貼っておきます

 

www.nicovideo.jp

なんとなくkotlinで書き直してみる

まだよくわかってないけどkotlinしてみる

import javafx.stage.Stage
import javafx.application.Application

import javafx.scene.Scene
import javafx.scene.control.Button
import javafx.scene.layout.BorderPane

import javafx.event.ActionEvent
import javafx.event.EventHandler

import javafx.animation.KeyFrame
import javafx.animation.Timeline
import javafx.animation.Animation

import javafx.util.Duration

import javax.sound.midi.Receiver
import javax.sound.midi.MidiSystem
import javax.sound.midi.ShortMessage

import javax.sound.midi.InvalidMidiDataException

fun main(args: Array<String>){
    Application.launch(DrumTest::class.java, *args)
}

class DrumTest() : Application(){
    private val receiver: Receiver
    
    private val pattern = "B-S-BBS-"
    private var patternIndex = 0
    
    init{
        receiver = MidiSystem.getReceiver()
    }
    
    override fun start(stage: Stage){
        val button = createDrumButton("8ビート!")
        val pane = BorderPane()
        
        pane.setCenter(button)
        
        val scene = Scene(pane, 320.0, 120.0)
        
        stage.setScene(scene)
        stage.show()
    }
    
    private fun createDrumButton(text: String): Button{
        val button = Button(text)
        
        val timer = Timeline(KeyFrame(Duration.millis(250.0), object : EventHandler<ActionEvent>{
            override fun handle(event: ActionEvent?){
                try{
                    if(pattern[patternIndex] == 'B'){
                        noteBassDrum();
                    }else if(pattern[patternIndex] == 'S'){
                        noteSnareDrum();
                    }
                }catch(ex: InvalidMidiDataException){
                    ex.printStackTrace();
                }

                patternIndex = (patternIndex + 1) % 8;
            }
        }))
        
        button.setOnAction({ _ ->
            if(timer.getStatus() == Animation.Status.STOPPED){
                timer.setCycleCount(16);
                timer.play();
            }
        })
        
        return button
    }
    
    private fun noteBassDrum(){
        val message = ShortMessage()
        message.setMessage(ShortMessage.NOTE_ON, 9, 36, 100)
        receiver.send(message, -1)
    }
    
    private fun noteSnareDrum(){
        val message = ShortMessage()
        message.setMessage(ShortMessage.NOTE_ON, 9, 38, 100)
        receiver.send(message, -1)
    }
}

参考
qiita.com