diff --git a/src/instr_grainlet.cc b/src/instr_grainlet.cc
new file mode 100644
index 0000000..22d4390
--- /dev/null
+++ b/src/instr_grainlet.cc
@@ -0,0 +1,67 @@
+#include "instr_Grainlet.hh"
+#include "daisysp.h"
+#include "utils.hh"
+
+namespace Heck {
+    namespace Instrument {
+
+        Grainlet::Grainlet()
+        {
+            init();
+            grainlet.Init(samplerate);
+        }
+
+        void Grainlet::init()
+        {
+            volEnv.Init(samplerate);
+            volEnv.SetTime(dsp::ADENV_SEG_ATTACK, .0001);
+            volEnv.SetTime(dsp::ADENV_SEG_DECAY, 0.1);
+            volEnv.SetMax(1);
+            volEnv.SetMin(0);
+            volEnv.SetCurve(-18);
+        }
+
+        void Grainlet::trigger()
+        {
+            volEnv.Trigger();
+        }
+
+        void Grainlet::ctl(unsigned int ctl_nr, float val)
+        {
+            switch (ctl_nr) {
+                case 0: {
+                    grainlet.SetFreq(scalen_min_max(val, 40, 400));
+                } break;
+                case 1: {
+                    volEnv.SetTime(dsp::ADENV_SEG_DECAY, 0.01 + val * 8.);
+                } break;
+                case 2: {
+                    grainlet.SetFormantFreq(scalen_min_max(val, 400, 2000));
+                } break;
+                case 3: {
+                    grainlet.SetShape(scalen_min_max(val, 0, 1));
+                } break;
+            }
+        }
+
+        void Grainlet::switch_mode1(unsigned int pos)
+        {
+            mode1 = pos;
+        }
+
+        void Grainlet::switch_mode2(unsigned int pos)
+        {
+            mode2 = pos;
+        }
+
+        float Grainlet::nextsample()
+        {
+            float out{};
+            out = grainlet.Process();
+            float volEnv_sig = volEnv.Process();
+            out *= volEnv_sig;
+            return out;
+        }
+
+    } // namespace Instrument
+} // namespace Heck
\ No newline at end of file
diff --git a/src/instr_grainlet.hh b/src/instr_grainlet.hh
new file mode 100644
index 0000000..24f4e4b
--- /dev/null
+++ b/src/instr_grainlet.hh
@@ -0,0 +1,32 @@
+#ifndef HECK_DAISY_INSTR_GRAINLET_HH
+#define HECK_DAISY_INSTR_GRAINLET_HH
+
+#include "instr_abstract.hh"
+#include "daisy_seed.h"
+#include "daisysp.h"
+
+namespace ld = daisy;
+namespace dsp = daisysp;
+
+namespace Heck {
+    namespace Instrument {
+
+        class Grainlet : public AbstractInstrument {
+        public:
+            Grainlet();
+            void init();
+            void trigger() override;
+            void ctl(unsigned int ctl_nr, float val) override;
+            void switch_mode1(unsigned int pos) override;
+            void switch_mode2(unsigned int pos) override;
+            float nextsample() override;
+        private:
+            dsp::GrainletOscillator grainlet{};
+            dsp::AdEnv volEnv{};
+            float mode1{};
+            float mode2{};
+        };
+
+    } // namespace Instrument
+} // namespace Heck
+#endif
\ No newline at end of file