nflags=klass() function nflags:init(o) self.e = o.e or 0 -- effect self.v = o.v or 0 -- volume self.w = o.w or 0 -- waveform and custom self.p = o.p or 0 -- pitch self:validate() end function nflags:clone() return nflags:new(self) end function nflags:validate() local e,v,w,p =self.e,self.v,self.w,self.p assert_range(e,0,8,"effect") assert_range(v,0,8,"volume") assert_range(w,0,16,"waveform") assert_range(p,0,64,"pitch") end function nflags:encode() self:validate() local e,v,w,p =self.e,self.v,self.w,self.p e &= 0xffff v &= 0xffff w &= 0xffff p &= 0xffff local wlow = w&7; local whi = (w&8)>>3; return ( (whi << 15) | (e << 12) | (v << 9) | (wlow << 6) | (p) ) end