package kernel.peripherals; import cc.Peripheral; using tink.CoreApi; class Speaker implements IPeripheral { public static inline final TYPE_NAME:String = "speaker"; private final addr:String; public function new(addr:String) { this.addr = addr; } public function getType():String { return Speaker.TYPE_NAME; } public function getAddr():String { return this.addr; } /** Plays a note block note through the speaker. The pitch argument uses semitones as the unit. This directly maps to the number of clicks on a note block. For reference, 0, 12, and 24 map to F#, and 6 and 18 map to C. A maximum of 8 notes can be played in a single tick. If this limit is hit, this function will return an error. **/ public function playNote(instrument:String, ?volume:Float = 1.0, ?pitch:Int = 12):Outcome { if (Peripheral.call(addr, "playNote", instrument, volume, pitch)) { return Success(null); } else { return Failure("maximum reached"); } } public function playSound(sound:String, ?volume:Float = 1.0, ?pitch:Float = 1.0):Outcome { try { if (Peripheral.call(addr, "playSound", sound, volume, pitch)) { return Success(null); } else { return Failure("Sound still playing"); } } catch (e) { return Failure("Sound does not exist"); } } public function playAudio(buffer:Array, ?volume:Float = 1.0):Outcome { try { if (Peripheral.call(addr, "playAudio", buffer, volume)) { return Success(null); } else { return Failure("Buffer full"); } } catch (e) { return Failure("Buffer malformed"); } } }