         return result
     }
 
-
-    public init?<S : Collection>(data: S) where S.Iterator.Element == Byte, S.SubSequence.Iterator.Element == S.Iterator.Element {
-        /// not enough data
+    public init(timetag: OSCTimeTag, content: [OSCMessage]) {
+        self.timetag = timetag
+        self.content = content
+    }
+
+    public init?<S : Collection>(data: S) where S.Iterator.Element == Byte, S.SubSequence.Iterator.Element == S.Iterator.Element {
+        /// Chechk the header
         guard
             data.count >= 16
         else {


public struct OSCBundle : OSCConvertible {
    public let timetag : OSCTimeTag
    public let messages : [OSCMessage]


    public var oscValue : [Byte] {
        var result = [Byte]()
        result += "#bundle".oscValue
        result += timetag.oscValue

        messages.forEach { msg in
            let v = msg.data
            result += Int32(v.count).oscValue
            result += v


        var msgs = [OSCMessage]()

        // Read up the content
        // from offset
        var ix = 16
        while ix < bytes.count {
            guard
                let chunk_len = Int(data: bytes[ix..<(ix+4)]),
                ix+4+chunk_len < bytes.count
            else {
                break
            }

            /// FIXME
            let msg = OSCMessage(data: [Byte]( bytes[(ix+4)..<(ix+chunk_len+4)] ))
            
            msgs.append(msg)

            /// step to the start of the next chunk
            ix = ix+4+chunk_len
        }

        self.content = msgs
    }
}
