--- /dev/null
+eps = 0.01;
+infty = 100;
+
+wall = 1;
+
+slot_off = 4;
+
+slot_l = 10;
+slot_depth = 2.5;
+side_w = 4;
+
+base_l = 4 + slot_l;
+
+hole_h = 10;
+hole_d = 1.5;
+hole_step = 1.5*hole_d;
+n_holes = 3;
+
+hole_side = 1.5*wall;
+
+module horn() {
+ difference() {
+ hull() {
+ // base
+ translate([slot_off, 0, 0])
+ cube([base_l, wall, wall]);
+
+ for (y = [1:n_holes]) {
+ translate([0, hole_h -(y-1)*hole_step, 0])
+ cylinder(r = hole_d/2 + hole_side,
+ h = wall, $fn = 6);
+ }
+ }
+
+ for (y = [1:n_holes]) {
+ translate([0, hole_h -(y-1)*hole_step, -eps])
+ cylinder(r = hole_d/2, h = wall + 2*eps, $fn = 6);
+ }
+ }
+
+
+ // side support
+ translate([slot_off, 0, 0])
+ cube([base_l, wall, side_w]);
+
+ // slot
+ hull() {
+ translate([slot_off + (base_l - slot_l)/2, -slot_depth/2, 0])
+ cube([slot_l, slot_depth/2, wall]);
+ translate([slot_off + (base_l - slot_l)/2 + wall, -slot_depth, 0])
+ cube([slot_l - 2*wall, slot_depth/2+eps, wall]);
+ }
+}
+
+for (x = [-1, 1]) scale([x, 1, 1])
+ translate([hole_side + hole_d/2 + 2*wall, 0, 0]) horn();