diff --git a/src/com/android/musicvis/GenericWaveRS.java b/src/com/android/musicvis/GenericWaveRS.java
index f34a4c0..e8a54a3 100644
--- a/src/com/android/musicvis/GenericWaveRS.java
+++ b/src/com/android/musicvis/GenericWaveRS.java
@@ -59,10 +59,6 @@
     // so 8 floats per line.
     protected float [] mPointData = new float[1024*8];
 
-    private Allocation mLineIdxAlloc;
-    // 2 indices per line
-    private short [] mIndexData = new short[1024*2];
-
     private ProgramVertex mPVBackground;
     private ProgramVertexFixedFunction.Constants mPVAlloc;
 
@@ -138,12 +134,8 @@
         // Start creating the mesh
         final Mesh.AllocationBuilder meshBuilder = new Mesh.AllocationBuilder(mRS);
         meshBuilder.addVertexAllocation(mVertexBuffer.getAllocation());
-        // Create the Allocation for the indices
-        mLineIdxAlloc = Allocation.createSized(mRS, Element.U16(mRS), mIndexData.length,
-                                               Allocation.USAGE_GRAPHICS_VERTEX |
-                                               Allocation.USAGE_SCRIPT);
-        // This will be a line mesh
-        meshBuilder.addIndexSetAllocation(mLineIdxAlloc, Primitive.LINE);
+        // This will be a triangle strip mesh
+        meshBuilder.addIndexSetType(Primitive.TRIANGLE_STRIP);
 
         // Create the Allocation for the vertices
         mCubeMesh = meshBuilder.create();
@@ -154,16 +146,8 @@
         mScript.set_gPointBuffer(mPointAlloc);
         mScript.set_gCubeMesh(mCubeMesh);
 
-        //  put the vertex and index data in their respective buffers
-        updateWave();
-        for(int i = 0; i < mIndexData.length; i ++) {
-            mIndexData[i] = (short) i;
-        }
-
-        //  upload the vertex and index data
+        //  upload the vertex data
         mPointAlloc.copyFromUnchecked(mPointData);
-        mLineIdxAlloc.copyFrom(mIndexData);
-        mLineIdxAlloc.syncAll(Allocation.USAGE_SCRIPT);
 
         // load the texture
         mTexture = Allocation.createFromBitmapResource(mRS, mResources, mTexId);
diff --git a/src/com/android/musicvis/waveform.rs b/src/com/android/musicvis/waveform.rs
index c3d75f2..b25f4cc 100644
--- a/src/com/android/musicvis/waveform.rs
+++ b/src/com/android/musicvis/waveform.rs
@@ -61,13 +61,9 @@
     float amp2 = sin(0.023f * wave2amp) * 80;
     float amp3 = sin(0.011f * wave3amp) * 40;
     float amp4 = sin(0.031f * wave4amp) * 20;
-    // calculate how many invisible lines there are on each side
-    int skip = (1024 - gWidth) / 2;
-    if (skip < 0) skip = 0;
-    int end = 1024 - skip;
-    for (int i = skip; i < end; i++) {
-        float val = sin(0.013f * (wave1pos + i)) * amp1
-                  + sin(0.029f * (wave2pos + i)) * amp2;
+    for (int i = 0; i < 1024; i++) {
+        float val = fabs(sin(0.013f * (wave1pos + i)) * amp1
+                  + sin(0.029f * (wave2pos + i)) * amp2);
         float off = sin(0.005f * (wave3pos + i)) * amp3
                   + sin(0.017f * (wave4pos + i)) * amp4;
         if (val < 2.f && val > -2.f) val = 2.f;
@@ -89,19 +85,13 @@
 
     int i;
 
-    // calculate how many invisible lines there are on each side
-    int width = gWidth;
-    if (width > 1024) width = 1024;
-    int skip = (1024 - width) / 2;
-    int end = 1024 - skip;
-
     if (gIdle) {
 
         // idle state animation
         float *points = (float*)gPoints;
         if (fadeoutcounter > 0) {
             // fade waveform to 0
-            for (i = skip; i < end; i++) {
+            for (i = 0; i < 1024; i++) {
                 float val = fabs(points[i*8+1]);
                 val = val * FADEOUT_FACTOR;
                 if (val < 2.f) val = 2.f;
@@ -127,7 +117,7 @@
             if (waveCounter != gWaveCounter) {
                 waveCounter = gWaveCounter;
                 float *points = (float*)gPoints;
-                for (i = skip; i < end; i++) {
+                for (i = 0; i < 1024; i++) {
                     float val = fabs(points[i*8+1]);
                     points[i*8+1] = (val * (FADEIN_LENGTH - fadeincounter) + idle[i*8+1] * fadeincounter) / FADEIN_LENGTH;
                     points[i*8+5] = (-val * (FADEIN_LENGTH - fadeincounter) + idle[i*8+5] * fadeincounter) / FADEIN_LENGTH;
@@ -158,7 +148,7 @@
     rsMatrixScale(&mat1, scale, scale, scale);
     rsgProgramVertexLoadModelMatrix(&mat1);
 
-    rsgDrawMesh(gCubeMesh, 0, skip * 2, width * 2);
+    rsgDrawMesh(gCubeMesh);
 
     return 1;
 }
